Sunteți pe pagina 1din 191

Proiect cofinanţat din Fondul Social European prin Programul Operaţional Sectorial Dezvoltarea Resurselor Umane 2007-2013

Investeşte în oameni!

Formarea profesională a cadrelor didactice


din învăţământul preuniversitar
pentru noi oportunităţi de dezvoltare în carieră

INFORMATICĂ PENTRU
PRELUCRAREA DATELOR FIZICE
Anişoara CONSTANTINESCU Adrian DAFINEI

Program de conversie profesională la nivel postuniversitar


pentru cadrele didactice din învăţământul preuniversitar

Specializarea FIZICĂ
Forma de învăţământ ID - semestrul I

2010
FIZICĂ

INFORMATICA PENTRU PRELUCRAREA


DATELOR FIZICE

Anişoara Adrian
CONSTANTINESCU DAFINEI

2010
© 2010 Acest manual a fost elaborat în cadrul "Proiectului pentru Învăţământul
Rural", proiect co-finanţat de către Banca Mondială, Guvernul României
şi comunităţile locale.

Nici o parte a acestei lucrări nu poate fi reprodusă fără acordul scris al


Ministerului Educaţiei, Cercetării, Tineretului şi Sportului.

ISBN 973-0-04084-2
Cuprins

Cuprins

1. ALGORITMI 1
1.1. Obiectivele Unităţii de învăţare 1 - Algoritmi 2
1.2. Algoritmi 2
1.3. Caracteristicile algoritmilor 3
1.4. Exemple de algoritmi 3
1.4.1. Calculul mediei aritmetice a n valori numerice x i , i ∈ 1, n r 3
1.4.2. Extragerea termenului cu valoarea cea mai mare x max , dintr-un şir x i dat. 4
1.4.3. Evaluarea valorii unui polinom pentru o valoare dată a variabilei x 5
1.4.4. Ordonarea crescătoare a unui şir 6
1.4.5. Algoritmul lui Euclid 8
1.5. Test de autoevaluare 1 8
1.6. Răspunsuri la testul de autoevaluare 1 9
1.7. Termeni şi expresii cheie. Formule cheie 10
1.8. Lucrare de verificare 11
1.9. Bibliografie 12

2. SCHEME LOGICE 13
2.1. Obiectivele Unităţii de învăţare 2 - Scheme logice 14
2.2. Elementele grafice ale unei scheme logice 14
2.3. Ciclu de instrucţiuni 15
2.3.1. Ciclu cu număr cunoscut de paşi 15
2.3.2. Ciclu cu ieşirea determinată de realizarea unei condiţii 16
2.4. Exemple de scheme logice 17
2.4.1. Schemă logică pentru algoritmul de calcul al mediei
aritmetice a n valori numerice date 17
2.4.2. Schema logică pentru algoritmul de calcul al valorii unui polinom 18
2.4.3. Schemă logică pentru algoritmul de ordonare 19
2.5. Test de autoevaluare 1 20
2.6. Răspunsuri la testul de autoevaluare 1 21
2.7. Termeni şi expresii cheie. 21
2.8. Lucrare de verificare 22
2.9. Bibliografie 22

3. ELEMENTE DE LIMBAJ TURBO PASCAL 23


3.1. Obiectivele Unităţii de învăţare 3 - Elemente de limbaj Turbo Pascal 24
3.2. Editorul TP 24
3.3. Structura unui program în TP 27
3.4. Tipuri de date în TP 27
3.5. Expresii, operatori, funcţii intrinseci 34
3.6. Test de autoevaluare 1 37
3.7. Răspunsuri la testul de autoevaluare 1 38
3.8. Termeni şi expresii cheie. 38
3.9. Lucrare de verificare 39
3.10. Bibliografie 39

Proiectul pentru Învăţământul Rural i


Cuprins

4. INSTRUCŢIUNI ÎN TURBO PASCAL 40


4.1. Obiectivele Unităţii de învăţare 4 – Instrucţiuni în Turbo Pasca 41
4.2. Instrucţiuni simple 42
4.2.1. Instrucţiuni de atribuire 42
4.2.2. Instrucţiuni de apelare a unei proceduri 42
4.2.3. Instrucţiunea GOTO 43
4.3. Instrucţiuni structurate 43
4.3.1. Instrucţiunea compusă 43
4.3.2. Instrucţiuni condiţionale 44
4.3.3. Instrucţiuni repetitive 46
4.4. Instrucţiunile de transfer de date: READ, READLN, WRITE, WRITELN 48
4.4.1. Instrucţiunile READ, READLN 48
4.4.2. Instrucţiunile WRITE, WRITELN 49
4.4.3. Fişiere de date 51
4.5. Test de autoevaluare 1 56
4.6. Răspunsuri la testul de autoevaluare 1 58
4.7. Lucrare de verificare 61
4.8. Termeni şi expresii cheie 62
4.9. Bibliografie 62

5. FUNCŢII ŞI PROCEDURI ÎN TURBO PASCAL 63


5.1. Obiectivele Unităţii de învăţare 5 - Funcţii şi proceduri în Turbo Pascal 64
5.2. Proceduri 64
5.2.1. Variabile locale şi globale 65
5.2.2. Domeniul de valabilitate al obiectelor 66
5.2.3. Parametri 67
5.3. Funcţii 70
5.4. Parametri funcţii şi parametri proceduri 72
5.5. Recursivitate 74
5.6. Test de autoevaluare 1 76
5.7. Răspunsuri la testul de autoevaluare 1 77
5.8. Termeni şi expresii cheie. Formule cheie 79
5.9. Bibliografie 79
5.10. Lucrare de verificare 80

6. GRAFICĂ ÎN TURBO PASCAL 81


6.1. Obiectivele Unităţii de învăţare 6 – Grafica în Turbo Pascal 82
6.2. Unit-uri standard 82
6.3. Unit-ul GRAPH 83
6.3.1. Iniţializarea modului grafic 84
6.3.2. Tratamentul erorilor grafice 85
6.3.3. Definirea ferestrelor în grafica TP 85
6.3.4. Reprezentarea punctelor în grafica TP 86
6.3.5. Reprezentarea liniilor- culori, stiluri şi grosimi;
deplasarea în fereastra grafică 87
6.3.6. Reprezentarea cercului , a arcului de cerc, a elipsei ,
a sectorului de cerc. Umplerea suprafeţelor închise. 88
6.3.7. Reprezentarea liniilor poligonale 89
6.3.8. Scrierea grafică 90
6.4. Test de autoevaluare 1 96
6.5. Răspunsuri la testul de autoevaluare 1 97

ii Proiectul pentru Învăţământul Rural


Cuprins

6.6. Termeni şi expresii cheie. 98


6.7. Lucrare de verificare 98
6.8. Bibliografie 98

7. ALGORITMI COMPLECŞI 99
7.1. Obiectivele Unităţii de învăţare 7 - Algoritmi complecşi 100
7.2. Sisteme de numeraţie 100
7.2.1. Conversia zecimal - binară 101
7.2.2. Conversia binar-zecimală 103
7.2.3. Conversia octal-binară 104
7.2.4. Conversia binar-octală 104
7.2.5. Conversia binar-hexazecimală şi invers 104
7.3. Test de autoevaluare 1 105
7.4. Rezolvarea ecuaţiilor algebrice 106
7.4.1. Metoda înjumătăţirii intervalului 107
7.4.2. Metoda Newton-Raphson 108
7.4.3. Metoda Birge-Vieta 109
7.5. Rezolvarea sistemelor de ecuaţii algebrice liniare 111
7.5.1. Metoda Gauss-Seidel 112
7.5.2. Metoda Gauss-Jordan 114
7.6. Integrarea numerică 115
7.6.1. Metoda trapezelor 116
7.6.2. Metoda Simpson 116
7.7. Integrarea numerică a ecuaţiilor diferenţiale de ordin 1 118
7.7.1. Metoda Runge-Kutta de ordin 4 119
7.8. Metoda Monte Carlo 121
7.8.1. Numere aleatoare 124
7.8.2. Principiul fundamental al metodei Monte Carlo 124
7.9. Test de autoevaluare 2 129
7.10. Răspunsuri la testele de autoevaluare 129
7.11. Termeni şi expresii cheie. Formule cheie 130
7.12. Lucrare de verificare 131
7.13. Bibliografie 132

8. PRELUCRAREA STATISTICĂ A DATELOR RXPERIMENTALE 133


8.1. Obiectivele Unităţii de învăţare 8
Prelucrarea statistică a datelor experimentale 134
8.2. Valoare medie, varianţă, abatere standard 134
8.3. Propagarea erorilor 137
8.4. Distribuţii 139
8.4.1. Distribuţia binomială 140
8.4.2. Distribuţia Poisson 142
8.4.3. Distribuţia Gauss 146
8.5. Metode de fit 149
8.5.1. Metoda celor mai mici pătrate pentru o dreaptă 149
8.5.2. Metoda celor mai mici pătrate pentru un polinom de grad 3 154
8.6. Test de autoevaluare 159
8.7. Răspunsuri la testul de autoevaluare 1 160
8.8. Termeni şi expresii cheie. Formule cheie 160
8.9. Lucrare de verificare 162
8.10. Bibliografie 162

Proiectul pentru Învăţământul Rural iii


Cuprins

9. SIMULAREA UNUI EXPERIMENT DE FIZICĂ 163


9.1. Obiectivele Unităţii de învăţare 9 – Simularea unui experiment de fizică 164
9.2. Experimentul Rutherford 164
9.2.1. Tratarea împrăştierii particulelor α prin formalismul Lagrange 168
9.3. Lucrare de verificare 178

Bibliografie 179

iv Proiectul pentru Învăţământul Rural


Introducere

Introducere

Vrei să fii profesor de fizică – membru al clubului select al fizicienilor ?


Există un standard al cerinţelor pe care trebuie să le împlineşti pentru
asta. Trebuie mai ales să fii conştient de vocaţia de ştiinţă integratoare a
fizicii. Fizica vrea să explice totul – de la nucleu la galaxii dar, totodată,
trebuie să folosească aparate ştiinţifice din toate domeniile. Nu poţi face
fizică fără solide cunoştinţe de matematică sau chimie. Nu poţi să nu
încerci să filozofezi asupra lumii. Şi nu poţi să te apropii de fizica modernă
fără sprijinul informaticii.

Cursul pe care tocmai ai început să-l citeşti reprezintă modulul


fundamental M1.2. din primul tău semestru de pregătire. Timpul alocat prin
programă studiului la acest modul este de două ore pentru curs şi două
ore pentru pregătirea practică de laborator. Examinarea de la sfârşitul
semestrului este scrisă şi ea acoperă 70% din aprecierea finală. Cadenţa
cu care vei răspunde la temele pe care ţi le propun unităţile de învăţare şi
corectitudinea acestor răspunsuri, întreaga ta activitate de-a lungul
semestrului vor acoperi alte 30% din aprecierea finală. La sfârşitul fiecărei
unităţi de învăţare vei găsi un test de verificare. Tema care ţi se propune
nu are răspuns în această carte . Nu are nici măcar sugestii de răspuns.
Va trebui să rezolvi problemele propuse. Fiecare lucrare de verificare este
punctată maximal cu 10 puncte. Punctele obţinute pentru rezolvarea
problemelor din lucrările de verificare reprezintă principalul criteriu pentru
aprecierea din cursul semestrului. Va fi de asemenea apreciată de tutore
capacitatea demonstrată (în întâlnirile directe) de a rezolva cu uşurinţă
probleme de programare.
Absolvirea modulului îţi aduce 8 credite.

Această carte îşi propune să te familiarizeze cu un minim de cunoştinţe de


informatică necesar prelucrării datelor experimentale, simulării unor
experimente de fizică şi prezentării rezultatelor într-o formă corectă şi
atractivă.
Presupunem un minim de cunoştinţe în folosirea unui calculator electronic
(câteva comenzi DOS, editare simplă de fişiere) şi un compilator TP
implementat pe calculatorul cu care lucrezi.

Sigur ai construit în copilărie vaporaşe din hârtie. Ştii ce important este să


faci toate îndoiturile în ordine perfectă. Să nu uiţi nimic. Să desfaci hârtia
exact cât trebuie ca să obţii un obiect tridimensional drăguţ dintr-o foaie
oarecare de hârtie.
Înţelegi deci că pentru orice lucrare ai nevoie de un plan bun, care să
prevadă ceea ce se va întâmpla la un moment dat şi că trebuie să fixezi

Proiectul pentru Învăţământul Rural v


Introducere

foarte bine succesiunea operaţiilor pe care urmează să le împlineşti. Tot


astfel Pentru rezolvarea problemelor de fizică, în general de calcul
numeric, e necesar să cunoşti:
• datele de la care porneşti (input)
• rezultatul sau rezultatele la care vrei să ajungi (output)
• algoritmul ce te duce de la input la output
Dacă pentru rezolvarea problemei vrei să fi asistat de calculator, va trebui
să cunoşti şi
• un limbaj de programare

Este foarte important ca fiecare din lucrurile de mai sus să-ţi fie foarte
clare.

Dacă primele două sunt destul de uşor de fixat, algoritmul şi limbajul de


programare sunt însă mai dificil de însuşit. Pentru rezolvarea aceleiaşi
probleme pot exista algoritmi diferiţi şi întotdeauna este necesar un studiu
pentru a vedea care algoritm se potriveşte cel mai bine problemei tale.
Pentru a avea o imagine clară a algoritmului ( adică succesiunea de
operaţii elementare ce conduc de la input la output) e bine să foloseşti o
schemă logică pentru reprezentarea lui. Îţi va fi cu siguranţă mult mai uşor
să traduci apoi această schemă logică într-un limbaj de programare.
Programul sursă (programul scris în limbajul de programare pe care îl
cunoşti şi pentru care dispui de un compilator pe calculatorul pe care
lucrezi) trebuie compilat. Calculatorul încearcă prin această operaţie să
înţeleagă ce i se cere să facă. Dacă felul în care au fost scrise
instrucţiunile nu este corect, el îţi semnalează erorile de sintaxă făcute. Va
trebui să corectezi erorile pe care le-ai făcut.
După corectarea programul din fişierul cu programul sursă intri din nou în
dialog cu calculatorul – compilezi din nou. Dacă de această dată
compilatorul nu mai găseşte erori de sintaxă atunci poţi da comanda de
execuţie a programului. Este bine să verifici programul din punct de
vedere al corectitudinii execuţiei. Pentru aceasta îl vei rula mai întâi pe un
exemplu simplu de control, pentru care ştii rezultatul. Dacă programul dă
rezultat corect pe exemplul de control poţi să-l foloseşti pe o clasă largă
de probleme de acelaşi tip.

În modul sunt incluse 9 unităţi de învăţare. Dacă le vei urmări cu îngrijire,


vei ajunge de la elementele primare de programare la rezolvarea unor
probleme frumoase (dar complicate) de fizică.
În prima unitate de învăţare te vei familiariza cu noţiunea de algoritm şi vei
vedea descrierea câtorva algoritmi simpli. Parcurgând a doua unitate de
învăţare vei căpăta competenţe în înţelegerea elementelor unei scheme
logice şi vei fi capabil să exemplifici cu schemele logice câţiva din
algoritmii prezentaţi în prima unitate. Este foarte important ca aceste două
capitole să fie bine înţelese. Va trebui să rezolvi toate temele propuse şi
să te asiguri că soluţiile sunt acceptabile.

Parcurgând unităţile de învăţare de la trei la nouă vei căpăta competenţe


de programare a asistenţei calculatorului pentru probleme de fizică.

vi Proiectul pentru Învăţământul Rural


Introducere

Dintre limbajele de programare am ales Turbo Pascal, acesta fiind un


limbaj mai prietenos decât FORTRAN, C++ sau altele.

Credem că sunt şanse mari ca tu să fi avut în liceu contact cu acest limbaj


de programare. Nu în ultimul rând, achiziţia compilatorului nu este foarte
împovărătoare financiar. Pe scurt, preţul plătit (în bani şi timp de pregătire)
este acoperit prin însuşirea folosirii unui limbaj util în rezolvarea
problemelor de fizică – şi în multe alte activităţi.
Trebuie să ai în minte tot timpul că rămânerea în editorul TP în timpul
compilării face mai uşoară corectarea erorilor de sintaxă. HELP-ul on line
(CTRL-F1 şi cursorul pe cuvântul al cărui înţeles vrem să-l verificăm) este
de mare ajutor în lămurirea unor comenzi TP şi prin exemplele pe care le
furnizează.
Programele transcrise - listate în acest manual sunt
operante. Ele sunt scrie cu un corp de literă diferit
de textul normal.
Elementele limbajului Turbo Pascal sunt prezentate în capitolele 3-6.
Considerând că ai căpătat suficiente competenţe generale, în unitatea de
învăţare 7 vei fi instruit cu utilizarea unor algoritmi complecşi de rezolvare
a unor probleme de matematică întâlnite în fizică. Vei vedea doar
descrierea sumară a acestor algoritmi (pentru studiul lor detaliat vei găsi
trimiteri la referinţele bibliografice) însoţită însă de programe în TP.
Unitatea de învăţare 8 este consacrată problemelor des întâlnite la
prelucrarea datelor în fizică: valori medii, abateri standard, distribuţii,
metode de fit. Unitatea de învăţare 9 este un exemplu de simulare a unui
experiment de fizică – experimentul Rutherford.
Am considerat că experienţa lui Rutherford prezintă un deosebit interes
pentru fizica atomică şi nucleară şi că din simularea ei se pot aprofunda
cunoştinţele asupra conservării energiei de-a lungul traiectoriei particulei α
în câmpul electric al unui nucleu ţintă (Au sau Ag ca în experimentul lui
Rutherford sau orice alt nucleu ). Tehnicile informatice folosite (achiziţie,
prelucrare şi reprezentare de date) reprezintă ilustrarea practică a utilităţii
folosirii informaticii pentru prelucrarea datelor de fizică. Această ultimă
unitate de învăţare este inclusă în modul pentru a ilustra cât de util este tot
ceea ce s-a învăţat în unităţile de învăţare 1-8.
Chiar dacă unele din cunoştinţele de mecanică analitică le vei căpăta ceva
mai târziu, rularea programului este simplă şi rezultatele sunt de interes
pentru un experiment care nu se poate efectua în laboratoare obişnuite.
Reţine că simularea asistată de calculator a experimentelor de fizică este
una dintre cele mai fructuoase direcţii de utilizare a informaticii în fizică.
Fiecare dintre unităţile de învăţare are scopurile definite la început. Ţi se
spune ce competenţe se aşteaptă să capeţi prin parcurgerea fiecărei
unităţii de învăţare.

Pictograma din capătul acestui rând marchează la fiecare


unitate de învăţare competenţele pe care ne aşteptăm să le dobândeşti.
Foloseşte coloana albă, nescrisă, a paginilor tipărite pentru a face
adnotările pe care le consideri necesare.
În banda albă a acestei pagini este plasată o pictogramă.

Proiectul pentru Învăţământul Rural vii


Introducere

Ai la sfârşitul fiecărui capitol teste la care răspunsurile sunt uşor de dat,


dacă ai citit cu atenţie capitolul.

Pictograma din capătul acestui rând este plasată în zona testelor de


autoverificare.
Fiecare test de autoevaluare are răspunsuri la sfârşitul unităţii de învăţare.
Dacă răspunsurile tale nu se apropie de cele corecte, trebuie să reciteşti
unitatea de învăţare – sau anumite părţi din ea – conform recomandărilor
din text.

La sfârşitul fiecărei unităţi de învăţare ai un test de verificare – pentru care


nu ai sugestii de răspunsuri.

Rezolvă-le cu îngrijire şi trimite răspunsurile pe care le consideri corecte


tutorelui tău.
În zona unui test de verificare, se află întotdeauna o pictogramă care
conţine semnul scrisorii electronice.

Pentru aprofundarea cunoştinţelor acumulate, la sfârşitul fiecărei unităţi de


învăţare vei găsi o bibliografie recomandată. Vei găsi de asemenea pe
una dintre ultimele pagini ale unităţii un breviar al lucrurilor esenţiale –
noţiuni, principii, formule a căror cunoaştere este esenţială pentru
acumularea de competenţe vizată. Dacă doreşti, ne poţi cere lămuriri;
toate relaţiile sunt numerotate şi ne poţi cere lămuriri despre oricare –
numind-o cu numărul său.

Sperăm să poţi parcurge întreaga carte. Suntem gata să te ajutăm să treci


orice hop fiind siguri că din această interacţiune avem de învăţat şi noi.
Aşteptăm să conversăm la adresele

anisoara@olimp.fiz.infim.ro asdafinei@yahoo.com

Nu ezitata să ne contactezi. Vei economisi timp şi noi vom acumula


experienţă de lucru cu studenţi aflaţi la distanţă de noi.

Anişoara CONSTANTINESCU
Adrian DAFINEI

viii Proiectul pentru Învăţământul Rural


Algoritmi

Unitatea de învăţare 1
ALGORITMI

Cuprins Pagina

ALGORITMI 1
1.1. Obiectivele Unităţii de învăţare 1 - Algoritmi 2
1.2. Algoritmi 2
1.3. Caracteristicile algoritmilor 3
1.4. Exemple de algoritmi 3
1.4.1. Calculul mediei aritmetice a n valori numerice x i , i ∈ 1, n 3
1.4.2. Extragerea termenului cu valoarea cea mai mare x max , dintr-un şir x i dat 4
1.4.3. Evaluarea valorii unui polinom pentru o valoare dată a variabilei x 5
1.4.4. Ordonarea crescătoare a unui şir 6
1.4.5. Algoritmul lui Euclid 8
1.5. Test de autoevaluare 1 8
1.6. Răspunsuri la testul de autoevaluare 1 9
1.7. Termeni şi expresii cheie. Formule cheie 10
1.8. Lucrare de verificare 11
1.9. Bibliografie 12

1
Algoritmi

1.1 Obiectivele Unităţii de învăţare 1 - Algoritmi

Când vei termina de studiat acest capitol vei fi capabil :

să defineşti algoritmul şi să-ţi clarifici ideea construcţiei


logice a algoritmului;

să identifici caracteristicile algoritmilor;

să precizezi succesiunile de instrucţiuni ale unor algoritmi


fundamentali

să aplici cunoştinţele dobândite pentru a construi algoritmi


cu care să rezolvi probleme de matematică utile în studiul
fizicii.

1.2 Algoritmi
Iniţial calculatoarele au fost folosite pentru a efectua calcule matematice.
S-a constatat că majoritatea problemelor de calcul ce trebuiesc rezolvate
se pot descompune în paşi elementari foarte simpli. Rezolvarea problemei
complicate revine la efectuarea paşilor mici, elementari. Pentru a pute să
aplici ideea de mai sus trebuie ca mai întâi:

• să te asiguri că există o soluţie a problemei pe care vrei să o rezolvi;


această asigurare poate fi dată de un studiu matematic făcut în prealabil

• să găseşti succesiunea operaţiilor aritmetice sau logice elementare cu


ajutorul cărora se obţine soluţia problemei. Se spune în acest caz că
dispui de ”algoritmul de rezolvare” al problemei.
Noţiunea de algoritm este o noţiune de bază pentru programarea unui
calculator.

Definiţie
Algoritmul reprezintă un set finit de reguli care indică operaţiile
necesare pentru a ajunge de la datele iniţiale ale unei probleme
(input) la rezultat (output).
Altfel spus un algoritm trebuie să descrie fără ambiguităţi calea de
rezolvare a unei probleme.

2
Algoritmi

Un algoritm este un proces alcătuit


dintr-o mulţime ordonată de paşi
descrişi fără echivoc.

1.3 Caracteristicile algoritmilor


Principalele caracteristici ale unui algoritm sunt:
• claritate; formularea precisă, deci neinterpretabilă, a propoziţiilor
algoritmului

• universalitate; aplicabilitatea algoritmului trebuie să fie posibilă nu numai


pentru anumite date ci pentru o clasă largă de date

• eficacitate; algoritmul permite obţinerea unui rezultat.

La baza eficacităţii unui algoritm stau trei proprietăţi şi anume:

– algoritmul conţine un umăr finit de instrucţiuni (indicaţii de calcul)

– fiecare instrucţiune descrie o singură operaţie de efectuat sau un număr


finit de asemenea operaţii

– algoritmul conduce la un număr finit de rezultate după un număr finit de


parcurgeri ale instrucţiunilor lui. Faptul că un algoritm este finit, în sensul
descris mai sus, permite reprezentarea lui grafică sub forma unui desen
numit schema logică.

1.4. Exemple de algoritmi

1.4.1. Calculul mediei aritmetice a n valori numerice x i , i ∈ 1, n


Enunţ

Consideră că ţi se dau n valori x i , cu i = 1


, , n . Găseşte o modalitate
prin care să calculezi media aritmetică a acestor valori.

Input: valoarea lui n şi valorile x i cu i = 1


, ,n

Output: valoarea mediei dată de relaţia matematică


1 n
x = ∑ xi (1.1)
n i =1

3
Algoritmi

Algoritm:

1. se citeşte n
2. se citesc valorile x i
3. se iniţializează cu zero variabila s în care se face
suma;
s=0
4. se iniţializează indicele i la 1, i = 1
5. se adună în s valoarea lui x i şi se scrie rezultatul în s,
s = s + xi
6. se creşte valoarea lui i cu 1,
i = i +1
7. se compară i cu n şi cât timp
i ≤n
se repetă operaţiile începând de la pasul 5; dacă
i >n
atunci se trece la pasul următor
8. La sfârşitul execuţiei vei avea în s suma elementelor
a căror medie o calculezi
n
s = ∑ xi
i =1
şi poţi calcula valoarea mediei:
s
9. x=
n

1.4.2. Extragerea termenului cu valoarea cea mai mare x max ,


dintr-un şir x i dat.
Enunţ

Consideră un şir format din n elemente, având valorile x i , cu i = 1


, ,n .
Stabileşte o modalitate de a determina valoarea cea mai mare x max a
elementelor din acest şir.

Input: valoarea lui n şi valorile x i cu i = 1


, ,n
Output: valoarea cea mai mare din şir , x max
Calea care îţi este propusă mai jos este să compari între ele valorile
termenilor din şir şi să păstrezi de fiecare dată valoarea cea mai mare.
Paşii algoritmului sunt descrişi în cele ce urmează:

4
Algoritmi

Algoritm:

1. se citeşte n
2. se citesc valorile x i
3. se atribuie lui x max valoarea x 1
x max = x1
4. se ia i = 2
5. se compară x max cu x i ; dacă
x max < x i
atunci se atribuie lui x max valoarea x i
x max = x i
şi se trece la pasul următor; dacă
x max > x i
atunci se trece la pasul următor adică
6. se creşte valoarea lui i cu o unitate,
i = i +1
7. se compară i cu n ; cât timp
i ≤n
se repetă de la pasul 5; dacă
i >n
atunci putem scrie că valoarea celui mai mare
element din şir este dată de x max

1.4.3. Evaluarea valorii unui polinom pentru o valoare dată a variabilei x

Enunţ
Consideră un polinom dat prin gradul său m şi coeficienţii săi a i cu i luând
valori de la m la 0, . Determină valoarea polinomului pentru o valoare dată
x0 a variabilei x.
Algoritmul se bazează pe schema lui Horner care scrie polinomul
P (x ) = am ⋅ x m + am −1 ⋅ x m −1 +  a1 ⋅ x + a0 (1.2)
în forma
P ( x ) = (( ((am ⋅ x + am −1 ) ⋅ x + am −2 ) ⋅ x + ) ⋅ x + a1 ) ⋅ x + a0 (1.3)
Input: gradul polinomului m, coeficienţii a i şi valoarea lui x0.

Output: valoarea polinomului

Scrierea polinomului în forma dată de relaţia (1.3) îţi permite stabilirea


unei modalităţi «în paşi» de rezolvare a problemei.

5
Algoritmi

Algoritm:

1.se citeşte m
2.se citesc coeficienţii ai pentru i mergând de la m la 0 cu
pasul -1
3.se citeşte valoarea lui x0
4.se atribuie valoarea am variabilei p, în care se calculează
valoarea polinomului, adică :
p = am
5.se ia i=m-1
6.se calculează
p = p⋅x0 + ai
(adică la p înmulţit cu x0 s-a adunat coeficientul ai unde acum
i = m-1
şi rezultatul s-a scris în variabila p)
7. din i se scade 1,
i=i-1
8. se compară i cu 0 şi cât timp
i≥0
se repetă de la pasul 6.
9. pentru i < 0 procesul de calcul s-a încheiat şi rezultatul dorit
este valoarea actuală a lui p

1.4.4. Ordonarea crescătoare a unui şir


Enunţ
Ordonează crescător, după valoare, termenii x i ai unui şir dat cu
i = 1
, ,n .

Există mai mulţi algoritmi de ordonare; în continuare vei face cunoştinţă cu


doi dintre aceştia.

Algoritmul A este un algoritm în care , plecând de la primul termen, se


face comparaţia unui termen cu toţi termenii de după el. De fiecare dată
termenul comparat este aşezat în ordine în poziţia corespunzătoare valorii
sale. La sfârşitul fiecărei secvenţe de comparaţie, pe ultimul loc între
termenii comparaţi se află cel cu valoarea cea mai mare. Paşii algoritmului
sunt descrişi mai jos.

6
Algoritmi

Algoritm A:

1. se citeşte n
2. se citesc cele n valori xi
3. se ia j=n-1
4. se ia i=1
5. se compară xi cu xi+1 ; dacă xi > xi+1 atunci se trece pe
locul cu indice mai mare termenul cu valoarea mai mare,
prin folosirea unei variabile ajutătoare aux ;
aux = xi , xi = xi+1, xi+1 = aux
6. se creşte i cu 1, i=i+1
7. pentru i ≤ j se repetă de la pasul 5; pentru i > j pe locul j+1
se află cea mai mare valoare din şirul de dimensiune j+1
8. se scade valoarea lui j cu 1
9. se compară j cu 1; cât timp j ≥ 1 se repetă de la pasul 4
10. pentru j=0 şirul este ordonat

Algoritmul B este un algoritm în care se compară vecinii. Dacă ordinea lor


este greşită, sunt «rotiţi», trecuţi unul în locul altuia folosind o variabilă
intermediară de stocare. Ori de câte ori se face o astfel de rotire un contor
este incrementat cu o unitate. Procesul este repetat până când există o
comparare a vecinilor care nu mai produce inversiuni – ceea ce înseamnă
că ordinea găsită la începutul comparaţiilor este bună. Paşii algoritmului
sunt descrişi mai jos.

Algoritm B:

1. se citeşte n
2. se citesc cele n valori xi
3. se ia o variabilă, să zicem k, egală cu zero, k=0; ea îşi va
schimba valoarea ori de câte ori vom schimba între ele
valori xi
4. se ia i=1
5. se compară xi cu xi+1 ; dacă xi > xi+1 atunci aux = xi xi = xi+1 ,
xi+1 = aux şi k=k+1; se trece la pasul 7
6. dacă xi ≤ xi+1 se trece la pasul următor
7. se ia i=i+1
8. se compară i cu n-1; cât timp i ≤ n − 1 se repetă procesul
începând de la pasul 5; când i = n se verifică valoarea lui
k; dacă este zero şirul este ordonat; dacă nu este zero
înseamnă că am făcut o schimbare de valori xi deci şirul
poate să nu fie încă ordonat; se repetă procesul începând
de la pasul 3

7
Algoritmi

1.4.5. Algoritmul lui Euclid

Consideră că ţi se dau două numere întregi şi pozitive, m şi n, şi ţi se cere


să determini cel mai mare divizor comun al acestor numere, adică cel mai
mare număr întreg pozitiv la care se împart atât m cât şi n.
Algoritmul Euclid îţi permite să determini cel mai mare divizor comun a
două numere întregi pozitive în următorul mod : împarte numărul mare la
numărul mic şi se reţine primul rest. Împarte apoi numărul mic la primul
rest şi se reţine noul rest – restul doi. Împarte primul rest la cel de-al doilea
rest şi se reţine cel de-al treilea rest. Continuă procedeul până la
realizarea unei împărţiri exacte. Ultimul rest obţinut înaintea împărţirii
exacte este divizorul comun al celor două numere cu care s-a început
procesul. Paşii algoritmului problemei sunt descrişi mai jos.

Algoritm:

1. se citesc m şi n.
2. te asiguri că m ≥ n; dacă nu este aşa atunci le schimbi
între ele cu ajutorul unei variabile ajutătoare ( aux=m,
m=n, n=aux ).
3. se determină restul împărţirii lui m la n ( acest rest se
scrie în variabila r , unde 0 ≤ r < n ).
4. se atribuie lui m valoarea lui n şi lui n valoarea lui r.
5. dacă n=0 algoritmul se încheie, răspunsul este
valoarea curentă a lui m.
6. dacă n ≠0 se repetă procesul începând cu pasul 3.

1.5. Test de autoevaluare 1

1. Scrie ce înseamnă algoritm

2. Precizează dacă ansamblul de instrucţiuni de mai jos poate fi


considerat un algoritm şi argumentează răspunsul.
1. Ieşi din casa şi mergi la şcoală
2. Repetă pasul 1.

8
Algoritmi

3. Alege valoarea maximă din şirul de 5 numere de mai jos


2, 7, -78, 0, 5

4. Calculează media numerelor


7, 3, 5, -15, 5

5. Calculează cel mai mare divizor comun al numerelor 1000 şi 1255,


folosind algoritmul lui Euclid

6. Ordonează crescător termenii şirului de la întrebarea 3, urmând


succesiunea paşilor prezentaţi în algoritmul A ( sau/şi B) de la
pagina numărul 7 din această unitate de învăţare.

Răspunsurile le găseşti la pagina 9

1.6. Răspunsuri la testul de autoevaluare 1

1. Algoritmul reprezintă un set finit de reguli care indică operaţiile


necesare pentru a ajunge de la datele iniţiale ale unei probleme
(input) la rezultat (output).
Altfel spus un algoritm trebuie să descrie fără ambiguităţi calea de
rezolvare a unei probleme.
2. Nu. Descrierea este echivocă. Nu ştii în ce fel persoana din
propoziţii ajunge înapoi de la şcoală acasă.
3. 7
4. 1
5. 5
6. -78, 0, 2, 5, 7

9
Algoritmi

1.7. Termeni şi expresii cheie. Formule cheie

Termeni şi expresii cheie


 Algoritm
 Evaluarea valorii unui polinom pentru o valoare
dată a variabilei
 Algoritm de ordonare
 Algoritmul lui Euclid

Formule cheie
1 n
 Formula de calcul a mediei aritmetice x = ∑ xi
n i =1
 Formula de calcul a valorii unui polinom pentru o
valoare dată a variabilei
P ( x ) = (( ((am ⋅ x + am −1 ) ⋅ x + am −2 ) ⋅ x + ) ⋅ x + a1 ) ⋅ x + a0

10
Algoritmi

1.8. Lucrare de verificare

Rezolvă problemele de mai jos. Trimite tutorelui răspunsurile pe care le


consideri corecte.

1. Scrie algoritmul pentru găsirea numărului de valori negative într-


un şir de n valori xi date. (2pt)

2. Scrie algoritmul pentru rezolvarea ecuaţiei de grad 2,


a ⋅ x2 + b ⋅ x + c = 0
oricare ar fi valorile coeficienţilor a, b şi c. (2pt)

3. Scrie algoritmul pentru simplificarea unei fracţii, m/n, folosind


algoritmul lui Euclid de găsire a celui mai mare divizor comun al
numerelor m şi n. Dacă m şi n nu au un divizor comun scrie că
fracţia nu se poate simplifica. (1pt)

4. Consideră un şir în care mai mulţi termeni au cea mai mare


valoare, din cele atribuite elementelor şirului
( de ex: 7, 20, 3, 20, 6, 2, 20, 1, 9).
Scrie algoritmul pentru determinarea valorii maxime a elementelor
dintr-un şir dat şi pentru stabilirea primei poziţii în şir pe care se
află această valoare maximă. (2pt)

5. Scrie algoritmul pentru aflarea valorii maxime, amax într-o matrice


pătrată de ordinul 4 dată, a(4X4). (1pt)

6. Dacă în matricea prezentată la punctul 5 există mai mulţi termeni


cu valoare maximă, scrie algoritmul pentru determinarea poziţiei
primului termen cu valoare maximă. (1pt)

Notă: Se acordă un punct din oficiu


Total 10 puncte

11
Algoritmi

1.9. Bibliografie

1. Donald E. Knuth Arta programării calculatoarelor Vol 1 Algoritmi


fundamentali, paginile 19-26, 106-116, Editura Teora
2. J. Glenn Brookshear Introducere în informatică, paginile 162-209,
Editura Teora

12
Scheme logice

Unitatea de învăţare 2
SCHEME LOGICE

Cuprins Pagina
2. SCHEME LOGICE 13
2.1. Obiectivele Unităţii de învăţare 2 - Scheme logice 14
2.2. Elementele grafice ale unei scheme logice 14
2.3. Ciclu de instrucţiuni 15
2.3.1. Ciclu cu număr cunoscut de paşi 15
2.3.2. Ciclu cu ieşirea determinată de realizarea unei condiţii 16
2.4. Exemple de scheme logice 17
2.4.1. Schemă logică pentru algoritmul de calcul
al mediei aritmetice a n valori numerice date 17
2.4.2. Schema logică pentru algoritmul de calcul al valorii unui polinom 18
2.4.3. Schemă logică pentru algoritmul de ordonare 19
2.5. Test de autoevaluare 1 20
2.6. Răspunsuri la testul de autoevaluare 1 21
2.7. Termeni şi expresii cheie. 21
2.8. Lucrare de verificare 22
2.9. Bibliografie 22

13
Scheme logice

2.1. Obiectivele Unităţii de învăţare 2 - Scheme logice

Când vei termina de studiat acest capitol vei fi capabil:

să foloseşti schemele logice pentru a-ţi clarifica ideile şi


pentru a putea comunica;

să identifici şi să foloseşti simbolurile grafice utilizate în


schemele logice;

să precizezi gruparea operaţiilor elementare ale unui


algoritm în interiorul schemei logice.;
;
să aplici cunoştinţele dobândite pentru a construi schemele
logice ale unor algoritmi.

Faptul că un algoritm conţine un număr finit de instrucţiuni îţi permite reprezentarea sa


grafică sub forma unei scheme logice. Schema logică facilitează schimbul de informaţii cu
alţi programatori – care îţi pot înţelege ideile algoritmului din schemă. Ea îţi este utilă chiar
şi ţie – adică celui ce a făcut programul de rezolvare a problemei. După un timp mai
îndelungat de la crearea programului şi dacă problema pe care o rezolvă programul are un
grad înalt de dificultate poate fi greu să-ţi reaminteşti ideile de bază şi detaliile programului
construit.

2.2. Elementele grafice ale unei scheme logice

Orice schemă grafică este construită cu un număr de elemente având


formă standardizată şi un înţeles comun pentru toţi programatorii. Aceste
elemente îţi sunt prezentate mai jos.

 săgeată: → Este un simbol cu care se leagă blocurile în schema


logică indicând şi sensul lor de parcurgere

 conector în pagină: Este un cerc ce conţine o literă sau un


număr; permite realizarea şi descrierea de legături între puncte ale
schemei logice.

 bloc delimitator: Este o elipsă ce conţine cuvântul START


sau STOP. Simbolul este folosit pentru marcarea celor două limite
între care se desfăşoară schema logică.

bloc de intrare/ieşire: Este un paralelogram în care se scriu date


(informaţia INPUT sau OUTPUT).

14
Scheme logice

 bloc de calcul: Este un dreptunghi în care se scriu instrucţiunile de


calcul. Dreptunghiul conţine descrierea unui proces.
 bloc de decizie cu 2 ieşiri: Este un triunghi în care este scrisă o
expresie relaţională sau logică pentru luarea unei decizii în caz de
realizare (DA sau valoare TRUE a rezultatului) sau altei decizii în caz de
nerealizare (NU sau valoare FALSE a rezultatului).

 bloc de decizie cu 3 ieşiri: Este un romb în care este scrisă o


expresie aritmetică ce se compară cu zero; cele trei ieşiri corespund
valorilor negativă, zero şi pozitivă ale expresiei aritmetice.

 bloc de procedură: Este un hexagon în care este scris numele


procedurii ce va fi înserate în acest punct al schemei logice.

2.3. Ciclu de instrucţiuni

Atunci când în rezolvarea unei probleme un grup de calcule se repetă de


un număr de ori vei spune că în schema logică de rezolvare a problemei
există un ciclu. Ciclul este format dintr-un grup de instrucţiuni care sunt
parcurse de atâtea ori de câte ori se specifică prin structura ciclului.

Ciclul este o structură iterativă în care o serie de


instrucţiuni – corpul ciclului – se execută repetat
sub supravegherea unui proces de control

2.3.1. Ciclu cu număr cunoscut de paşi


În figura 2.1. poţi observa schema logică a unui ciclu cu număr finit de paşi

Figura 2.1

15
Scheme logice

În această schemă logică, i este variabila ce controlează ciclul; ea variază


între valorile iniţială, v i şi finală, v f , cu pasul r; corpul ciclului conţine
ansamblul calculelor care se efectuează în cadrul unui pas al ciclului.
Reţine că într-un astfel de ciclu

• se cunoaşte numărul de repetări ale ciclului egal cu MAX(ABS(INT((v f −


v i + r)/r)), 0). Altfel spus numărul de repetări ale ciclului este dat de cea
mai mare valoare între 0 şi valoarea absolută a părţii întregi a expresiei (v f
− v i + r)/r; în cazul obţinerii valorii zero se trece la instrucţiunea ce
urmează ultimei instrucţiuni din ciclu, adică ciclul nu se mai execută

• variabila care controlează ciclul poate să participe sau nu la calculele


care se fac în cadrul ciclului

• nu este permisă modificarea valorii variabilei de control a ciclului în


corpul ciclului; modificarea se face doar în locul unde se dă avans
variabilei, i=i+r, adică unde se pregăteşte noua iteraţie - pasul următor al
ciclului.

2.3.2. Ciclu cu ieşirea determinată de realizarea unei condiţii

Schema logică a unui ciclu cu număr necunoscut de paşi îţi este


prezentată în figura 2.2.

Figura 2.2

Observă că în acest tip de ciclu repetarea calculelor din corpul ciclului se


face cât timp nu este îndeplinită condiţia de ieşire din ciclu. Evident în
corpul ciclului, în cursul execuţiilor succesive, trebuie să se modifice una
sau mai multe variabile din condiţia de ieşire din ciclu; dacă acest lucru nu
se realizează, ciclul se execută la infinit.

16
Scheme logice

2.4. Exemple de scheme logice


În continuare vei putea analiza câteva scheme logice propuse pentru
algoritmii analizaţi în unitatea de învăţare anterioară.

2.4.1. Schemă logică pentru algoritmul de calcul al mediei aritmetice a n


valori numerice date

Algoritmul de calcul al mediei aritmetice prezentat anterior are ca scop


stabilirea operaţiilor necesare pentru a calcula media aritmetică a n valori
numerice x i .
Schema logică a algoritmului este prezentată în figura 2.3.

Figura 2.3

Observă că, în această schemă logică, ciclul are un număr cunoscut de


paşi, n, şi că ciclul asigură repetarea instrucţiunii s=s+x i de n ori astfel că
la ieşirea din ciclu în s se află suma valorilor x i . Să verificăm această
schemă logică pe calculul mediei notelor unui elev deştept dar nu prea
silitor. Fie aceste note 5, 9, 7, 10, 4. În urma execuţiei blocului
”citeşte n şi x i ” se realizează introducerea datelor de intrare
n=5, x 1 =5, x 2 =9, x 3 =7, x 4 =10 şi x 5 =4.

Urmând schema logică, procesul este amorsat cu valorile


s=0 şi i=1.
Reţine că variabilele din dreapta semnului “=“(care are sens de atribuire şi
nu de egal sau identic aşa cum se obişnuieşte în scrierea din matematică)
au valori atribuite anterior iar rezultatul este atribuit variabilei din stânga
semnului de atribuire. Succesiunea ciclică de operaţii este următoarea:
s=0+x 1 =0+5=5; i=1+1=2; 2 < 5

17
Scheme logice

(s-a executat ciclul cu valoarea x 1 ; s-a comandat trecerea la noua valoare


a indicelui i; s-a verificat dacă numărul de paşi nu depăşeşte numărul de
paşi programaţi). Întrucât nu s-a efectuat numărul declarat de paşi, se
reiau operaţiile ciclului
s=s+x i =5+x 2 =5+9=14; i=2+1=3; 3 < 5,
apoi
s=14+x 3 =14+7=21; i=3+1=4; 4 < 5,
şi din nou
s=21+x 4 =21+10=31; i=4+1=5; 5=5;
Apoi
s=31+x 5 =31+4=35; i=5+1=6;
Întrucât s-a realizat numărul propus de paşi (6 nu mai este mai mic sau
egal cu 5) se opreşte execuţia ciclurilor şi nota medie este
35/5=7;
Se scrie acum nota medie 7(şapte) şi calculul se termină.

2.4.2. Schema logică pentru algoritmul de calcul al valorii unui polinom


Un algoritm prezentat anterior conţine succesiunea de operaţii pentru
evaluarea unui polinom de grad m şi coeficienţi a m , a m−1 ,..., a 1 , a 0 într-un
punct x 0 . În figura 2. 4 este prezentată schema logică a algoritmului.

Figura 2.4

Urmând schema logică vei evalua polinomul


p(x) = 5x4 + 2x3 − 5x2 − 3 pentru x 0 = 1.
În urma execuţiei blocului ”citeşte m, şi a i cu i=m,...,0 şi x 0 ” vei avea în
cursul execuţiei m=4, a 4 =5, a 3 =2, a 2 =-5, a 1 =0, a 0 =-3 şi x 0 =1.

18
Scheme logice

2.4.3. Schemă logică pentru algoritmul de ordonare

Acest algoritm ordonează crescător un şir de valori x i . Vei folosi două


cicluri; unul după j (j ia valori descrescătoare între m-1 şi 1) şi un ciclu
după i, inclus în ciclul după j (i ia valori de la 1 la j). Schema logică este
prezentată în figura 2.5.

Figura 2.5

Poţi verifica această schemă logică pe şirul de 7 valori x i : 7, -1, 3, 1, 10, 4,


-5.
După prima execuţie a ciclului după i de la 1 la j=n-1=6, şirul ia forma:
-1, 3, 1, 7, 4, -5, 10.
După a doua execuţie a ciclului după i de la 1 la j-1=5 şirul ia forma:
-1, 1, 3, 4, -5, 7, 10.
A treia execuţie a ciclului după i de la 1 la j=4 duce la şirul:
-1, 1, 3, -5, 4, 7, 10.
A patra execuţie a ciclului după i de la 1 la j=3 dă şirul:
-1, 1, -5, 3, 4, 7, 10.
A cincia execuţie a ciclului după i de la 1 la j=2 dă şirul:
-1, -5, 1, 3, 4, 7, 10.
În sfârşit a şasea execuţie a ciclului după i de la 1 la j=1 dă şirul ordonat:
-5, -1, 1, 3, 4, 7, 10.
Observă în această schemă logică folosirea conectorilor în pagină şi
drumul de la START la STOP pe orice ramură a schemei logice.

19
Scheme logice

2.5. Test de autoevaluare 1

1. Defineşte schema logică.

2. Scrie cuvintele ce se pot afla în interiorul elipsei care reprezintă


blocul delimitator.

3. Precizează ce simboluri grafice pot fi scrise în interiorul


conectorului.

4. Ce conţine simbolul grafic al blocului de calcul

5. Descrie simbolurile grafice folosite în schemele logice care sunt


reprezentate prin patrulatere.

6. Defineşte ciclul – aşa cum este el înţeles în programare.

Răspunsurile le găseşti la pagina 21

20
Scheme logice

2.6. Răspunsuri la testul de autoevaluare 1

1. Schema logică este reprezentarea grafică a unui algoritm cu număr


finit de instrucţiuni. Schema logică facilitează schimbul de informaţii
între programatori.
2. În elipsa care reprezintă blocul delimitator se pot afla cuvintele
START sau STOP. Simbolul este folosit pentru marcarea celor două
limite între care se desfăşoară schema logică.
3. În interiorul cercului care reprezintă conectorul de pagină se pot
afla litere sau numere care permit realizarea şi descrierea de legături
între puncte ale schemei logice.
4. Dreptunghiul care reprezintă grafic blocul de calcul conţine
descrierea unui proces.
5. Sunt trei simboluri în formă de patrulater :
bloc de intrare/ieşire; Este un paralelogram în care se
scriu date (informaţia INPUT sau OUTPUT).
bloc de calcul; Este un dreptunghi în care se scriu
instrucţiunile de calcul. Dreptunghiul conţine descrierea unui proces.
bloc de decizie cu 3 ieşiri; Este un romb în care este
scrisă o expresie aritmetică ce se compară cu zero; cele trei ieşiri
corespund valorilor negativă, zero şi pozitivă ale expresiei aritmetice.

6.Ciclul este o structură iterativă în care o serie de instrucţiuni – corpul


ciclului – se execută repetat sub supravegherea unui proces de
control

2.7. Termeni şi expresii cheie.

 Reprezentarea structurii logice a algoritmului prin


simboluri grafice;
 Ciclu;
 Bloc delimitator, conector, bloc de intrare ieşire;
 Bloc de calcul , bloc de decizie, bloc de procedură.

21
Scheme logice

2.8. Lucrare de verificare

Rezolvă problemele de mai jos. Trimite tutorelui răspunsurile pe care le


consideri corecte.

1. a. Elaborează o schemă logică pentru algoritmul de extragere a


valorii maxime dintr-un şir dat. (1,5pt)
b. Exemplifică funcţionarea schemei pe care o propui, pentru
selectarea valorii maxime din şirul de numere întregi 2, 7 ,-78, 0, 5.
(1,5pt)

2. a. Realizează o schema logică pentru un algoritmul de tip B,


descris la paragraful 1.4.4 şi folosit pentru a ordona crescător valorile
elementelor unui şir. (1,5pt)
b. Exemplifică funcţionarea schemei logice propuse de tine pentru
şirul 7, 3, 5, -15, 5, 2. (1,5pt)

3. a. Elaborează o schemă logică pentru implementarea algoritmului


lui Euclid. (1,5pt)
b. Descrie funcţionarea schemei logice propuse, pentru
determinarea celui mai mare divizor comun al numerelor 2006004 şi
3003006. (1,5pt)

Notă: se acordă un punct din oficiu;


Total: 10 puncte

2.9. Bibliografie

1. Petre Dimo, Programarea în FORTRAN, Editura Didactică şi


Pedagogică, Bucureşti, paginile 9-44

22
Elemente de limbaj Turbo Pascal

Unitatea de învăţare 3
ELEMENTE DE LIMBAJ TURBO PASCAL

Cuprins Pagina

3. ELEMENTE DE LIMBAJ TURBO PASCAL 23


3.1. Obiectivele Unităţii de învăţare 3 - Elemente de limbaj Turbo Pascal 24
3.2. Editorul TP 24
3.3. Structura unui program în TP 27
3.4. Tipuri de date în TP 27
3.5. Expresii, operatori, funcţii intrinseci 34
3.6. Test de autoevaluare 1 37
3.7. Răspunsuri la testul de autoevaluare 1 38
3.8. Termeni şi expresii cheie. 38
3.9. Lucrare de verificare 39
3.10. Bibliografie 39

23
Elemente de limbaj Turbo Pascal

3.1. Obiectivele Unităţii de învăţare 3 - Elemente de limbaj Turbo Pascal

Când vei termina de studiat acest capitol vei fi capabil :

să înţelegi modul în care programatorul interacţionează cu


calculatorul în construirea şi exploatarea programelor de
calcul;
să utilizezi editorul TP şi să ştii să repari erorile de sintaxă
semnalate după compilare;

să identifici caracteristicile datelor de intrare şi ieşire pentru


programul TP şi să le selectezi tipul;

să utilizezi expresiile, operatorii şi funcţiile intrinseci TP;


;
să aplici cunoştinţele dobândite pentru a construi programe
cu care să rezolvi probleme simple de fizică.

Limbajul PASCAL este un limbaj de programare de nivel înalt, proiectat de Niklaus Wirth
de la Universitatea Tehnică din Zurich în 1971 şi numit astfel în cinstea lui Blaise Pascal,
celebrul matematician şi filozof francez.
TURBO PASCAL conţine o serie de facilităţi faţă de limbajul PASCAL:
mediu integrat, ordonare liberă a secţiunilor în partea de declaraţie a programului, etc. O
descriere detaliată a limbajului Turbo Pascal o găseşti, de exemplu, în referinţele
bibliografice generale [4].

3.2. Editorul TP

Între utilizatorul care ar vrea să folosească în operarea calculatorului un


limbaj cât mai apropiat de limbajul natural şi calculatorul care foloseşte
limbajul lui 1 şi 0 exista «straturi» de comunicare. Datele sunt primite de
calculator după ce au fost condiţionate de BIOS. Schimbul efectiv de
informaţii între utilizator şi calculator este facilitat de sistemul de operare
primar, DOS. Peste acest sistem de comunicare se poate interpune un
altul, mai prietenos cu utilizatorul – cum ar fi de exemplu Windows. În
sfârşit, peste sistemul de operare se poate aşeza un limbaj de
programare, o limba simplă , cu nu prea multe cuvinte , în care utilizatorul
comunică maşinii de calcul sarcinile pe care doreşte să le vadă executate.
Pe calculatoarele personale mai vechi “conversaţia” cu calculatorul se
face prin tastare de instrucţiuni la prompter-ul DOS
Calculatoarele mai evoluate, folosesc Windows - care permite în
continuare folosirea prompter-ului DOS. Acest prompter poate fi activat
prin succesiunea de comenzi Start, Programs, Accessories, Command
Prompt.

24
Elemente de limbaj Turbo Pascal

Dacă pe calculatorul tău, ceva mai vechi, rulează un sistem de operare


BIOS – DOS, editorul Turbo Pascal se activează tastând cuvântul «turbo» la
acronim Command Prompt şi ENTER. Pe ecran apare următoarea imagine:
pentru basic
input/output
system
(sistem de
intrare/ieşire
de bază). În
cazul
calculatoarelo
r compatibile
PC(personal
computer),
este setul
esenţial de
rutine
software care
verifică
componentele Figura 3.1
hardware la
pornire , Dacă pe calculator rulează ca sistem de operare o variantă oarecare de
lansează Windows, se poate activa modul DOS prin tastarea succesiunii de taste
sistemul de deja descrise. Acelaşi rezultat se obţine dacă din meniul Start se face
operare şi opţiunea Run, urmată de comanda cmd scrisă în fereastra de comenzi.
oferă suportul După tastarea la prompter-ul DOS a cuvântului turbo şi a tastei ENTER.
necesar Pe ecran apare aceeaşi figură – dar într-o fereastră Windows. Dacă se
traficului doreşte rularea limbajului Turbo Pascal în fereastră DOS, unică, se poate
datelor între tasta (în Windows) combinaţia de taste Alt-Enter. Revenirea la Windows
componentele se face cu aceeaşi combinaţie de taste. Un avantaj al utilizării ecranului
hardware. DOS este posibilitatea imediată de folosire a mouse-ului.
Aşa cum se vede în figura 3.1. primul rând al ecranului editorului conţine
un meniu. El este activat apăsând tasta F10 . Te poţi deplasa pentru
opţiuni apăsând tastele săgeţi la stânga sau la dreapta pe una din
componente. Dacă apeşi tasta ENTER se deschide o fereastră cu un
submeniu, în care te deplasezi cu tastele săgeţi în sus sau în jos până la
comanda dorită. Apăsarea tastei ENTER activează comanda selectată din
submeniu. De exemplu ieşirea din editor se face tastând F10, deplasându-
te pe FILE, tastând ENTER, deplasându-te apoi în submeniu pe EXIT şi
tastând ENTER.
În rândul de jos sunt date acţiunile unor taste (cel mai des folosite):

DOS – acronim pentru disk operating system (sistem de operare pe disc).


Termen generic prin care se face referire la orice sistem de operare care se
încarcă de pe disc la pornirea sau reiniţializarea calculatorului. Iniţial,
termenul făcea deosebire între sistemele de operare aflate pe discuri şi cele
destinate unor microcalculatoare în care erau păstrate într-o memorie
permanentă sau erau încărcate de pe bandă magnetică

25
Elemente de limbaj Turbo Pascal

F3-OPEN deschide un fişier cu extensia .PAS din directorul curent, F2


SAVE salvează programul în fişierul curent, F 10 MENIU activează rândul
de sus. Comenzile importante sunt duplicate – în sensul că se pot face
atât din meniul de sus cât şi din comenzi înscrise în bara de jos.

Windows – sistem de operare lansat de Microsoft


Corporation . Windows este un mediu multitasking (care
poate rezolva simultan mai multe sarcini) cu interfaţă
grafică cu utilizatorul, care poate rula pe sisteme bazate
pe MS-DOS sau ca sistem de operare independent.

Alte combinaţii de taste de interes sunt:


• ALT-F5 determină ieşirea temporară din editor pentru a vedea
rezultatele unui calcul. Revenirea în editorul TP se face tastând ENTER.
• ALT-n determină trecerea în fereastra n ( 1 ≤ n ≤ 9 )
• ALT-F3 determină închiderea ferestrei curente.
• CTRL-F9 determină lansarea în execuţie a programului din fereastra
curentă.
Între rândul de sus şi cel de jos se află ecranul pe care îl poţi considera o
pagină albă pe care scrii textul programului în Turbo Pascal. Compilatorul
TP nu distinge între literele mari şi mici (nu este case sensitive).
Comentariile se scriu în acolade. Rămânând în editorul TP putem edita
simultan mai multe programe cu F10, FILE, NEW; fiecare program este
editat într-o pagină; paginile sunt numerotate de la 1 la 9.

În ecranul de editare, vei scrie în limbaj TP toate lucrurile necesare


programului pe care îl generezi. Ansamblul redactat este codul sursă al
programului. Înaintea execuţiei programului, codul sursa trebuie tradus în
cod obiect – o formă pe care calculatorul s-o înţeleagă. Operaţia de
trecere de la codul sursă la codul obiect este compilarea. Pentru TP
operaţia de compilare este asigurată de compilatorul TP lansat prin
tastarea ALT-F9 sau Compile. În cursul compilării, este verificată
corectitudinea formală a scrierii cuvintelor TP pe care intenţionezi să le
foloseşti în program. Îţi sunt semnalate toate erorile de sintaxă. Trebuie să
ai în vedere că operaţia de verificare este strict formală. Compilatorul nu-ţi
poate semnala că programul tău este prost conceput şi că nu răspunde
cerinţelor pe care le ai în vedere. După ce – prin compilare – codul sursă
este acceptat, poţi comanda execuţia programului tastând RUN. Verifică
pe cazuri cunoscute corectitudinea rezultatelor furnizate de program.

26
Elemente de limbaj Turbo Pascal

Dacă ai de făcut o comunicare într-o limbă străină, concepi mai întâi un text cu
idei clare, ordonate şi înlănţuite logic în limba română (ai conceput algoritmul
comunicării ideilor); verifici apoi că toate cuvintele pe care le foloseşti sunt
clare şi toate virgulele sunt puse la locul lor (ai făcut compilarea). Traduci apoi
textul şi trimiţi scrisoarea (execuţi programul pe care ţi l-ai propus). Şi aştepţi
rezultatele!
Nu uita: Editare – Compilare - Execuţie

3.3. Structura unui program în TP


Un program, în orice limbaj de programare, reprezintă o serie de
instrucţiuni pe care procesorul calculatorului le execută dacă le înţelege.
Un program în TP este compus dintr-un bloc precedat de un antet. Antetul
conţine cuvântul PROGRAM urmat de numele programului. Blocul
programului conţine o parte declarativă şi o parte executabilă.
Partea declarativă poate conţine definiţii de constante (secţiunea începe
cu CONST), declaraţii de variabile (secţiunea începe cu VAR), etichete
(LABEL), definirea unor tipuri de date (TYPE), funcţii şi proceduri.
Pentru etichete, constante, tipuri de date, variabile, funcţii, proceduri, unit-
uri şi programe se folosesc identificatorii. Un identificator începe cu o
literă, după primul caracter sunt permise litere, cifre şi caracterul _
(underscore) . Un identificator nu poate conţine blancuri (în TP blancul e
considerat separator). Lungimea unui identificator poate fi oricare dar doar
primele 63 de caractere sunt semnificative.
Partea executabilă începe cu BEGIN, specifică acţiunile asupra datelor
conform algoritmului de calcul şi se termină cu END.
Observă această structură în EX1.PAS la pagina 29.

3.4. Tipuri de date în TP


În memoria calculatorului, la nivel de cod maşină, datele se reprezintă ca
şiruri de cifre binare. Trecerea de la datele de intrare (în sistemul zecimal)
la această reprezentare binară şi invers, trecerea de la reprezentarea
internă a datelor la cea a datelor de ieşire (în sistemul zecimal), nu te
interesează în detaliu; pentru calculator informaţia asupra felului în care se
face această transformare este dată de tipul de date.
Un tip de date defineşte o mulţime finită de valori şi o mulţime finită de
operaţii asociate.
Fiecărei date i se asociază un tip unic.
În limbajul PASCAL există patru tipuri de date nestructurate: INTEGER,
REAL, CHAR, BOOLEAN şi mai multe tipuri de date structurate între care
vei distinge deocamdată numai tipurile: ARRAY, STRING, RECORD, FILE
şi procedural. Un tip structurat de date este caracterizat prin tipul sau
tipurile componentelor şi prin metoda structurării sale. Când programezi
poţi defini şi alte tipuri de date - de exemplu tipurile enumerare şi interval.

27
Elemente de limbaj Turbo Pascal

3.4.1. Tipul INTEGER

Tipul INTEGER reprezintă o submulţime a mulţimii numerelor întregi


dependentă de implementare. În Turbo Pascal există 5 tipuri întregi
predefinite.
În tabelul din figura 3.2 îţi sunt prezentate caracteristicile acestor tipuri de
întregi.

Tip Domeniu Memorie


shortint -129...127 8-bit cu semn
integer -32768...32767 16-bit cu semn
longint -2147483648...2147483647 32-bit cu semn
byte 0...255 8-bit fără semn
word 0..65535 16-bit fără semn
Figura 3.2

Reţine că operaţiile aritmetice cu operanzi de tip întreg folosesc precizia 8-


bit, 16- bit sau 32-bit conform următoarelor reguli:

• tipul unei constante de tip întreg este predefinit tip întreg cu domeniul cel
mai mic care include valoarea constantei întregi.
• pentru un operator binar, ambii operanzi sunt convertiţi la tipul lor comun
înainte de operaţie. Tipul comun este predefinit ca tipul întreg cu cel mai
mic domeniu care include toate valorile posibile ale ambelor tipuri.
Operaţia este realizată folosind precizia tipului comun şi tipul rezultatului
este tipul comun.
• expresia din partea dreaptă a unei instrucţiuni de atribuire este evaluată
independent de domeniul şi tipul variabilei din stânga.
• dacă rezultatul operaţiei între valori întregi se situează în afara
domeniului reprezentând tipul întreg apare o eroare în faza de execuţie a
programului.
• operatorii binari pentru operanzi întregi sunt: +, -, *, DIV, MOD
• funcţii pentru operanzi întregi sunt: ABS, SQR
• operatorii relaţionali sunt: =, <>, >=, <=, >, <
• tipul întreg defineşte o succesiune ordonată de valori deci pentru fiecare
valoare (cu excepţia capetelor intervalului ) se pot defini un succesor şi un
predecesor cu funcţiile:
SUCC(x)=x+1
PRED(x)=x-1

3.4.2. Tipul REAL


Tipul REAL reprezintă o submulţime finită a numerelor reale. În Turbo
Pascal există 5 tipuri reale predefinite, dar în directiva de compilare
selectată implicit, {$N-}, se lucrează doar cu variabile de tip real cărora li
se alocă 6 octeţi/variabilă, au domeniul de valori 2.9 E-38..1.7E38 şi 11-12
cifre semnificative.

• operatorii binari pentru tipul REAL sunt: +, -, *, /

28
Elemente de limbaj Turbo Pascal

• funcţiile standard sunt: ABS, SQR, LN, EXP, SQRT, SIN, COS, ARCTAN
• funcţiile de transfer sunt:
TRUNC pentru conversia în întreg cu trunchierea părţii fracţionare a
argumentului şi
ROUND pentru conversia în întreg cu rotunjirea părţii fracţionare a
argumentului
ROUND(x) = TRUNC(x+0.5) pentru x>=0
ROUND(x) = TRUNC(x-0.5) pentru x<0
• pe mulţimea valorilor reale nu este definită o relaţie de ordonare deci nu
pot fi folosite funcţiile SUCC şi PRED.

3.4.3. Tipul CHAR

Tipul CHAR reprezintă o mulţime finită şi ordonată de caractere din setul


de caractere ASCII ( American Standard Code for Information Interchange
) extins.
Încearcă programul următor pentru a vedea caracterele ASCII şi numărul
de ordine corespunzător fiecărui caracter:

EX1.PAS
program caractere_ASCII;
label unu;
var i,j:integer; f:text;
begin
assign(f,’codASCII.out’); rewrite(f);
for i:=1 to 6 do write(f, i:2,’:’,char(i):2,’;’);
writeln(f); j:=0;
for i:=14 to 255 do
begin
write(f,i:3,’:’,char(i):2,’;’);j:=j+1;
if j<10 then goto unu
else
begin
j:=0; writeln(f);
end;
unu: end;
end.

3.4.4. Tipul BOOLEAN

Tipul BOOLEAN este un tip de date logice cu 2 elemente FALSE < TRUE
ceea ce-ţi permite să aplici asupra variabilelor de acest tip
• operatori logici: NOT, AND, OR
• operatori relaţionali: =, <>, <=, >=, <, >
• relaţii de ordine: ORD(FALSE) = 0; ORD(TRUE) = 1;
SUCC(FALSE) = TRUE; PRED(TRUE) = FALSE
Tipurile predefinite INTEGER, CHAR şi BOOLEAN definesc mulţimi finite
şi ordonate, motiv pentru care se mai numesc şi tipuri scalare sau
ordinale.

29
Elemente de limbaj Turbo Pascal

3.4.5. Tipul enumerare

Tipul enumerare este descris de enumerarea componentelor sub forma


unei liste ordonate de valori pe care le poate lua o variabilă de tipul
respectiv. Exemplu: TYPE culoare=(alb, roşu, galben, verde, albastru);

• Ordinea în care sunt enumeraţi identificatorii în listă îţi defineşte relaţia


între componente permiţând aplicarea operatorilor relaţionali precum şi a
funcţiilor PRED, SUCC şi ORD (Atenţie! numărul de ordine al primei
componente este 0).
ORD(alb) = 0; ORD(rosu) = 1; PRED(rosu) = alb; SUCC(alb) = rosu,...

3.4.6. Tipul interval

Tipul interval este un subdomeniu de valori dintr-un tip primitiv ( cu


excepţia celui REAL) sau al unui tip enumerare, denumit tip de bază.

• Definiţia unui interval ( sau subdomeniu ) specifică valorile cea mai mică
şi cea mai mare în interval separate prin simbolul .. . Ambele constante
trebuie să fie de acelaşi tip ordinal.

Exemple:
0..99 subdomeniu al tipului de bază BYTE
-128..127 subdomeniu al tipului de bază SHORTINT
’C’..’R’ subdomeniu al tipului de bază CHAR
rosu..albastru subdomeniu al tipului de bază « enumerare »definit mai sus

• O variabilă de tip interval are toate proprietăţile variabilelor tipului de


bază, dar valoarea sa în timpul execuţiei programului trebuie să fie în
intervalul specificat.

3.4.7. Tipul ARRAY

Tipul ARRAY (tablou) este o structură omogenă formată dintr-un număr fix
de componente de acelaşi tip numit tip de bază.
Diagrama de sintaxă ce defineşte acest tip este prezentată în figura 3.3:

Figura 3.3

în care tip_indice este un tip ordinal iar tip_bază este orice tip.
Fiecare componentă a unui tablou este selectată printr-un indice care ia
valori într-o mulţime finită numită tipul indicelui. Tipuri indice valabile sunt
toate tipurile ordinale cu excepţia lui LONGINT; tip indice nu poate fi un tip
structurat.

30
Elemente de limbaj Turbo Pascal

Exemple:
TYPE vector=array[1..10] of real; {defineste tipul
structurat vector reprezentand multimea tablourilor ce
au 10 componente de tip real; observati definirea
domeniului in care ia valori indicele}
VAR u, v : vector;
[
Tipul de bază poate fi orice tip nestructurat sau structurat.
Accesarea unei componente a tabloului se face prin identificatorul tablo-
ului şi valoarea indicelui.
Pot exista şi tablouri cu mai multe dimensiuni. Astfel
ARRAY [BOOLEAN] OF ARRAY[1..10] OF ARRAY[1..2] OF REAL;
este interpretat de compilator ca
ARRAY[BOOLEAN, 1..10, 1..2] OF REAL;
Poţi accesa un element al tabloului multidimensional specificând valorile
indicilor din parantezele drepte. Astfel
VAR a:ARRAY[1..10] OF ARRAY[1..20] OF REAL;
defineşte o matrice cu 10 linii şi 20 coloane. Elementul din linia i şi coloana
j se identifică prin a[i][j] sau a[i, j].

3.4.8. Tipul STRING

Tipul string (şir de caractere) este specific limbajului Pascal. Valoarea unei
variabile de acest tip este formată dintr-un număr de caractere.
Tipurile string sunt tipuri structurate într-un mod asemănător cu tipul
ARRAY, cu diferenţa majoră că numărul de caractere într-un şir poate
varia dinamic între zero şi limita superioară specificată (între 1 şi 255).
Diagrama de sintaxă ce defineşte acest tip este prezentată în figura 3.4:

Figura 3.4
Întreg_fără_semn este o constantă întreagă în domeniul 1..255 şi dă
lungimea maximă a şirului de caractere. Dacă lungimea nu este explicit
specificată, valoarea implicită considerată este 255.

Exemple:
TYPE nume=STRING[14];
VAR s1, s2:nume;
sau direct
VAR s1, s2:STRING[14] {tip anonim }

Variabilele de tip STRING ocupă în octeţi lungimea maximă plus un octet


(primul) ce conţine lungimea curentă a variabilei. Caracterele individuale
într-un şir sunt indiciate de la 1 la lungimea şirului.
Expresiile STRING constau din constante şiruri, variabile tip STRING,
nume de funcţii şi operatori.

31
Elemente de limbaj Turbo Pascal

Operaţia de concatenare se realizează cu operatorul + sau cu funcţia


concat. Dacă lungimea şirului rezultat depăşeşte 255 calculatorul
semnalează o eroare la execuţie.

Aplicarea operatorilor de relaţie (prioritate mai mică decât + ) se face


caracter cu caracter de la stânga la dreapta conform valorilor ASCII
asociate. Dacă şirurile au lungimi diferite dar sunt egale până la ultimul
caracter din şirul mai scurt, atunci şirul mai scurt este considerat mai mic.
Şirurile sunt egale numai dacă lungimile şi conţinutul şirurilor sunt identice.

O valoare tip CHAR este compatibilă cu o valoare tip STRING


considerându-se un string de lungime 1.

Asignarea şirurilor:
age := ’optsprezece’;

Reţine că dacă prin asignare se depăşeşte lungimea maximă a variabilei


de tip STRING, caracterele în exces sunt trunchiate.

3.4.9. Tipul RECORD


Tipul RECORD (înregistrare) este un tip compus format dintr-un număr de
componente, numite câmpuri. Spre deosebire de variabilele de tip
ARRAY, câmpurile, elemente ale variabilelor de tip RECORD, pot fi de
tipuri diferite. Fiecare câmp are un nume, identificatorul de câmp.
Diagrama de sintaxă a definirii tipului RECORD îţi este prezentată în
figura de mai jos:

Figura 3.5
Fişierele unde lista câmpurilor are diagrama de sintaxă:
constau
dintr-o
secvenţă de
componente
de acelaşi tip.
Numărul de
componente
într-un fişier Figura 3.6
(dimensiunea Referirea la o componentă a unei variabile de acest tip o vei face conform
fişierului) nu următoarei diagrame de sintaxă:
este
determinat
prin definirea
fişierului

Figura 3.7

32
Elemente de limbaj Turbo Pascal

Exemple de variabile de tip record pe care le vei folosi în grafică, sunt cele
prezentate mai jos.

TYPE viewporttype=RECORD
x1, y1, x2, y2 : integer;
clip : boolean;
END;

TYPE pointtype=RECORD
x, y : integer;
END;

3.4.10. Tipul FILE


În TP există două fişiere standard predeclarate: fişierul standard de intrare
(tastatura) şi fişierul standard de ieşire (ecranul monitorului). Dacă vrei să
citeşti sau să scrii date folosind un fişier de pe discul magnetic atunci
trebuie să defineşti o variabilă de tip FILE pe care să o pui în
corespondenţă cu fişierul dorit.
Fişierele constau dintr-o secvenţă de componente de acelaşi tip. Numărul
de componente într-un fişier (dimensiunea fişierului) nu este determinat
prin definirea fişierului. Tipul unui fişier este definit de cuvântul rezervat
FILE OF şi urmat de tipul componentelor fişierului. Componentele unui
fişier pot fi de orice tip exceptând tipul file.
În figura 3.8 poţi observa diagrama de sintaxă pentru tipul FILE .

Figura 3.8

Exemple:
TYPE f=file of byte;
g=file of real;

VAR a,b:f;
c:g;

Corespondenţa între variabila tip fişier şi numele fişierului o vei face


apelând procedura ASSIGN(FilVar, Str) unde FilVar este numele variabilei
tip fişier iar Str este numele fişierului.
Exemple:
ASSIGN(a,’date.in’);
ASSIGN(c,’xdat.out’);

După asignarea numelui fişierului variabilei tip fişier în instrucţiunile


READ sau WRITE va interveni doar numele variabilei tip fişier.

33
Elemente de limbaj Turbo Pascal

3.5. Expresii, operatori, funcţii intrinseci

O expresie reprezintă o formulă ce defineşte calculul unei valori prin


aplicarea unor operatori asupra unor operanzi care pot fi constante,
variabile, funcţii. Evaluarea unei expresii se face de la stânga la dreapta
respectând nişte reguli de prioritate ale operatorilor. În Turbo Pascal există
4 nivele de prioritate prezentate în tabelul din figura 3.9:

Figura 3.9

Există trei reguli de bază pentru prioritate într-o expresie şi anume:


• un operand aflat între doi operatori de priorităţi diferite este legat de
operatorul de prioritate mai înaltă.
• un operand aflat între doi operatori de priorităţi egale este legat de
operatorul din stânga sa.
• expresiile din paranteze se evaluează prioritar fiind tratate ca un singur
operand.
La scrierea expresiilor trebuie să ai în vedere:
• să nu omiţi operatorul înmulţirii ∗, între doi operanzi.
• să nu-ţi apară doi operatori consecutivi: de exemplu expresia x∗−y
este scrisă greşit pe când expresia x∗(-y) este scrisă corect.
• să fi sigur că toţi operanzii reprezentaţi prin variabile au valori definite
anterior evaluării expresiei.

3.5.1. OPERATORII ARITMETICI


În tabelul din figura 3.10 îţi sunt prezentaţi operatorii aritmetici.

Figura 3.10

34
Elemente de limbaj Turbo Pascal

3.5.2. OPERATORI LOGICI

Tabelul din figura 3.11 îţi evidenţiază operatorii logici cu operanzii şi


acţiunea efectuată.

Figura 3.11
• dacă operandul operatorului not este de un tip întreg, rezultatul este de
acelaşi tip întreg
• dacă ambii operanzi ai operatorilor and, or, xor sunt de câte un tip
întreg, tipul rezultatului este tipul comun al celor doi operanzi.

3.5.3. OPERATORI BOOLEENI


Poţi observa operatorii booleeni cu operanzii şi acţiunea efectuată în
tabelul din figura 3.12.

Figura 3.12

3.5.4. OPERATORUL STRING

Figura 3.13

35
Elemente de limbaj Turbo Pascal

3.5.5. OPERATORI DE RELAŢIE

Figura 3.14

Reţine că:
• la compararea tipurilor simple e necesar ca tipurile să fie compatibile;
totuşi dacă un operand este de tip real, celălalt poate fi de un tip întreg

• compararea şirurilor se face conform cu ordonarea setului de caractere


ASCII. Oricare două valori string pot fi comparate deoarece toate valorile
string sunt compatibile. O valoare tip CHAR este compatibilă cu o valoare
tip STRING; când ele sunt comparate valoarea tip CHAR este tratată ca o
valoare tip STRING de lungime 1.

3.5.6. FUNCŢII STANDARD: f : A → B

În expresie, A este domeniul pe care sunt definite funcţiile, B este


domeniul în care iau valori funcţiile. Funcţiile care operează în TP sunt
• funcţii matematice:
sin, cos, arctan, exp, ln, sqrt, A = {real, integer}, B = {real}
abs, sqr, A = {real, integr }, B = A
• funcţii de transfer:
trunc, round, A = {real}, B = {integer}
• funcţii scalare:
ord, A = {integer, char}, B = {integer} pred, succ, A = {integer, char }, B = A
chr, A = {integer }, B = {char }

3.5.7. Exerciţiu pentru familiarizare cu Turbo Pascal

Încearcă un program simplu pentru a te familiariza mai bine cu editorul TP.


Programul pe care ţi-l propunem converteşte un unghi dat în radiani într-
un unghi în grade, minute, secunde. Scrie programul în fişierul EX2.PAS.

36
Elemente de limbaj Turbo Pascal

EX2.PAS.
program conversie; {acesta este antetul programului}
const pi=3.14159; {partea de declaratie a programului
cu definire constante si declaratii de variabile}
var gfr, mfr, radian : real;
grade, minute, secunde : integer;
begin {partea executabila a programului}
writeln(’ introdu unghiul in radiani’); readln(radian);
gfr:=radian*180.0/pi; grade:=trunc(gfr);
mfg:=(gfr-grade)*60.0; minute:=trunc(mfr);
secunde:=trunc((mfr-minute)*60.0);
writeln(radian:10:2,’ radiani = ’, grade, ’ grade ’,
minute,’ minute ’,secunde,’ secunde’);
readln;
end.

3.6. Test de autoevaluare 1

1. Defineşte operaţia de compilare TP.

2. Descrie structura unui program TP.

3. Precizează caracteristicile tipului de date INTEGER.

4. Scrie tipurile de date structurate din TP

5. Scrie operatorii aritmetici cu care se operează în TP.

Răspunsurile le găseşti la pagina 38

37
Elemente de limbaj Turbo Pascal

3.7. Răspunsuri la testul de autoevaluare 1

1. Compilarea este operaţia de trecere de la codul sursă la codul


obiect . În cursul compilării sunt semnalate erorile formale de scriere
ale codului sursă care împiedică scrierea codului obiect – inteligibil
calculatorului.

2. Un program în TP este compus dintr-un bloc precedat de un antet.


Antetul conţine cuvântul PROGRAM urmat de numele programului.
Blocul programului conţine o parte declarativă şi o parte executabilă.
Partea declarativă poate conţine definiţii de constante (secţiunea
începe cu CONST), declaraţii de variabile (secţiunea începe cu VAR),
etichete (LABEL), definirea unor tipuri de date (TYPE), funcţii şi
proceduri.

3.
Domeniu Memorie
shortint -129...127 8-bit cu semn
integer -32768...32767 16-bit cu semn
longint -2147483648...2147483647 32-bit cu semn
byte 0...255 8-bit fără semn
word 0..65535 16-bit fără semn

4. ARRAY, STRING, RECORD, FILE şi procedural .

5. Adunare scădere, înmulţire, împărţire, împărţire întreagă (diviziune)


restul împărţirii (modulo)

3.8. Termeni şi expresii cheie

 Editare, compilare, rulare a unui program TP


 Tipuri structurate şi nestructurate de date în TP
 Operatori aritmetici, logici booleeni şi de relaţie
 Funcţii matematice, funcţii de transfer, funcţii scalare

38
Elemente de limbaj Turbo Pascal

3.9. Lucrare de verificare


Rezolvă problemele de mai jos. Trimite tutorelui răspunsurile pe care le
consideri corecte.

1. Câte tipuri de date nestructurate sunt predefinite în TP ? Sunt toate


aceste tipuri de date tipuri ordinale? Care din ele sunt şi de ce?
(1pt)
2. Ce tipuri de date structurate sunt recunoscute de limbajul TP?
(0,5pt)
3. Prin ce se deosebeşte tipul String de tipul Array? (0,5pt)
4. Care sunt operatorii aritmetici şi care este ordinea lor de execuţie
într-o expresie aritmetică? (1pt)
5. Care sunt operatorii de relaţie şi care este acţiunea lor? (1pt)
6. Ce realizează operatorul + aplicat asupra unor variabile de tip Char
sau String ? (1pt)
7. Scrie o succesiune de instrucţiuni care să permită efectuarea
următoarelor calcule aritmetice (2pt)
 (x + y ) − (x − y )
1/ 2 1/ 2

1.
 (x + y )

  z2 + y 2 z2 − y 2 
2 . tg  + 
  2 yz 2 yz 
 

8. Variabilele L1 şi L2 sunt variabile logice ce pot lua valorile TRUE


sau FALSE; scrie instrucţiunea prin care se calculeze funcţia Q1,
definită prin următoarea tabelă de adevăr. (1 pt)
L1 F F T T
L2 F T F T
Q1 T F F F
9. Variabilele L1 şi L2 sunt variabile logice ce pot lua valorile TRUE
sau FALSE; scrie instrucţiunea prin care se calculeze funcţia Q2,
definită prin următoarea tabelă de adevăr. (1 pt)
L1 F F T T
L2 F T F T
Q2 F T T T
Notă: se acordă un punct din oficiu
Total: 10 puncte

3.10. Bibliografie
1. Anişoara Constantinescu, Simona Şerban, Victor Ionuţ Stoica, Limbajul
de programare Turbo Pascal Editura Anima, paginile 5-24.

39
Instrucţiuni în Turbo Pascal

Unitatea de învăţare 4
INSTRUCŢIUNI ÎN TURBO PASCAL

Cuprins Pagina

4. INSTRUCŢIUNI ÎN TURBO PASCAL 40


4.1. Obiectivele Unităţii de învăţare 4 – Instrucţiuni în Turbo Pasca 41
4.2. Instrucţiuni simple 42
4.2.1. Instrucţiuni de atribuire 42
4.2.2. Instrucţiuni de apelare a unei proceduri 42
4.2.3. Instrucţiunea GOTO 43
4.3. Instrucţiuni structurate 43
4.3.1. Instrucţiunea compusă 43
4.3.2. Instrucţiuni condiţionale 44
4.3.3. Instrucţiuni repetitive 46
4.4. Instrucţiunile de transfer de date: READ, READLN, WRITE, WRITELN 48
4.4.1. Instrucţiunile READ, READLN 48
4.4.2. Instrucţiunile WRITE, WRITELN 49
4.4.3. Fişiere de date 51
4.5. Test de autoevaluare 1 56
4.6. Răspunsuri la testul de autoevaluare 1 58
4.7. Lucrare de verificare 61
4.8. Termeni şi expresii cheie 62
4.9. Bibliografie 62

40
Instrucţiuni în Turbo Pascal

4.1. Obiectivele Unităţi de învăţare 4 – Instrucţiuni în Turbo Pascal

Când vei termina de studiat acest capitol vei fi capabil :

să înţelegi structura programului TP


să foloseşti declaraţii şi instrucţiuni specifice limbajului
Turbo Pascal;

să identifici instrucţiunile după acţiunea lor;

să foloseşti sintaxa corectă în limbajul Turbo Pascal pentru


instrucţiunile structurate;

să aplici cunoştinţele dobândite pentru a construi programe


TP cu care să rezolvi probleme de diferite tipuri.

Imaginează-ţi instrucţiunile TP ca pe nişte indicaţii redactate - cu sintaxa


specifică – în „limba TP”. Aceste indicaţii sunt înţelese şi executate de
calculator.

O instrucţiune în TP se termină de regulă cu simbolul ; se pot scrie mai


multe instrucţiuni pe un rând sau o instrucţiune pe mai multe rânduri – în
funcţie de poziţionarea semicolonului ; Instrucţiunea poate avea o
etichetă. Diagrama de sintaxă pentru o instrucţiune o poţi observa în figura
4.1.

Figura 4.1

Instrucţiunea este un enunţ care specifică o acţiune într-un limbaj de


calculatoare. Programele sunt formate din două tipuri de enunţuri: instrucţiuni
şi declaraţii. Declaraţia este asociaţia dintre un identificator şi anumite
informaţii. Declaraţia unei constante – de exemplu - presupune asocierea
dintre numele şi valoarea sa.

41
Instrucţiuni în Turbo Pascal

4.2. Instrucţiuni simple

În vorbirea directă te poţi exprima în cuvinte singulare, în propoziţii simple,


în fraze sau în blocuri de fraze. Tot astfel în limbajul TP există diferite
tipuri de instrucţiuni.
Instrucţiuni simple sunt instrucţiunea de atribuire, instrucţiunea de apelare
a unei proceduri şi instrucţiunea de transfer pentru execuţia programului la
o instrucţiune cu etichetă.

4.2.1. Instrucţiuni de atribuire

Figura 4.2

Exemple:
radian := 1.5;
gfr := radian∗180.0/pi; grade := trunc(gfr);
{ai întâlnit aceste instrucţiuni de atribuire
în exemplul EX2.PAS }

Instrucţiunea de atribuire înlocuieşte valoarea curentă a unei variabile cu o


valoare specificată ca o expresie. Valoarea expresiei trebuie să fie de
acelaşi tip sau de un tip compatibil cu tipul variabilei.

4.2.2. Instrucţiuni de apelare a unei proceduri


Procedura este un ansamblu de instrucţiuni căruia îi sunt asociate
constante, tipuri de date şi variabile şi care are ca scop realizarea unei
anumite sarcini – de regulă unice. Procedura are un nume (identificator).
Diagrama de sintaxă a instrucţiunii procedură este:

Figura 4.3

42
Instrucţiuni în Turbo Pascal

Instrucţiunea procedură specifică activarea unei proceduri notate prin


identificatorul procedurii. Dacă declararea procedurii conţine o listă de
parametrii formali atunci instrucţiunea procedură trebuie să aibă aceeaşi
listă de parametrii actuali ( problema va fi repusă şi tratată în detaliu în
unitatea de învăţare numărul 5).

4.2.3. Instrucţiunea GOTO

Diagrama de sintaxă a instrucţiunii goto este următoarea:

Figura 4.4

Blocul este un grup de instrucţiuni dintr-un program care sunt tratate


ca un tot.

Instrucţiunea goto (du-te la o etichetă) transferă execuţia programului la


instrucţiunea ce are ca prefix eticheta la care instrucţiunea face referinţă .
La folosirea instrucţiunii goto urmăreşte regula ca eticheta referită în
instrucţiunea goto să fie obligatoriu în acelaşi bloc ca şi instrucţiunea
însăşi. Cu alte cuvinte nu poţi face transfer în sau în afara unei proceduri
sau funcţii.

4.3. Instrucţiuni structurate

Instrucţiunile structurate sunt construcţii formate din alte instrucţiuni


executate fie secvenţial ( în instrucţiunea compusă ) fie condiţional ( în
instrucţiunile condiţionale ) fie iterativ ( în instrucţiunile repetitive ).

4.3.1. Instrucţiunea compusă


Instrucţiunea compusă reprezintă o secvenţă de instrucţiuni considerată
un tot şi executată în ordinea în care instrucţiunile din secvenţă sunt
scrise. Instrucţiunile componente ale instrucţiunii compuse sunt separate
prin ; şi sunt încadrate în parantezele de instrucţiune BEGIN şi END ca în
diagrama de sintaxă ce îţi este prezentată în figura 4.5.

Figura 4.5

43
Instrucţiuni în Turbo Pascal

Reţine că instrucţiunea compusă este tratată sintactic ca o singură


instrucţiune.
Partea executabilă a unui program poate fi astfel considerată ca o singură
instrucţiune compusă.

4.3.2. Instrucţiuni condiţionale


O instrucţiune condiţională selectează pentru execuţie o singură
instrucţiune (sau nici o instrucţiune) din instrucţiunile sale componente.
Diagrama de sintaxă a instrucţiunii IF îţi este prezentată în figura
următoare

Figura 4.6

în care expresie este o expresie booleană ce trebuie să dea un rezultat


de tip boolean. Dacă rezultatul evaluării expresiei este TRUE se execută
instrucţiune1. Dacă rezultatul evaluării expresiei este FALSE şi este
prezent ELSE se execută instrucţiune2. Dacă rezultatul evaluării
expresiei este FALSE şi nu este prezent ELSE atunci se trece la
instrucţiunea următoare instrucţiunii IF.

Reţine că:
• delimitatorul ; nu trebuie pus înaintea lui ELSE deoarece ar duce la
terminarea deciziei implicate de IF fără a considera şi cea de a doua
alternativă.

• dacă instrucţiune1 sau/şi instrucţiune2 sunt formate din mai


multe instrucţiuni, ele se tratează ca instrucţiuni compuse şi sunt
executate în integritatea lor.

• în general un ELSE este asociat cu cel mai apropiat IF neasociat deja cu


un alt ELSE. Ambiguitatea sintactică ce apare din construcţii ca:
IF expresie1 THEN IF expresie2 THEN instrucţiune1
ELSE instrucţiune2;
se rezolvă interpretând construcţia astfel:
IF expresie1 THEN
BEGIN
IF expresie2 THEN
instructiune1
ELSE
instructiune2
END

44
Instrucţiuni în Turbo Pascal

( nu era neapărat necesară paranteza begin .. end ) . În cazul prezentat în


continuare, pentru interpretarea corectă este neapărat necesară
paranteza begin .. end.
IF expresie1 THEN
BEGIN
IF expresie2 THEN instructiune1
END
ELSE
instructiune2

În limbajul TP faptul că scrii cu litere mari sau mici este


nesemnificativ. Totuşi, pentru urmărirea mai uşoară a
programelor este bine să-ţi faci un automatism de scriere.
De exemplu poţi să scrii mereu comenzile cu majuscule.
Este, evident, doar o sugestie

4.3.2.2. Instrucţiunea CASE

Figura 4.7

Instrucţiunea CASE permite alegerea şi execuţia unei singure instrucţiuni


dintre mai multe instrucţiuni componente în funcţie de valoarea unei
expresii scalare (expresie din diagrama de sintaxă) numită expresie
selector.

45
Instrucţiuni în Turbo Pascal

Instrucţiunile componente sunt precedate de una sau mai multe constante


distincte ce au valori de acelaşi tip simplu ( INTEGER, CHAR, BOOLEAN,
enumerare, interval ) ca şi tipul expresiei selector. Ordinea acestor
’etichete’ este arbitrară.

Expresia selector, de tip ordinal, poate lua valori între -32768 şi 32767 şi
deci nu poate fi de tip LONGINT, WORD sau STRING. Instrucţiunea CASE
execută instrucţiunea prefixată de o constantă CASE egală cu valoarea
expresiei selector sau prefixată de un domeniu CASE ce conţine valoarea
expresiei selector. Dacă nu există o astfel de constantă CASE şi este
prezentă partea ELSE se execută instrucţiunea ce urmează pe ELSE.
Dacă nu există partea ELSE nu se execută nici-o instrucţiune.

4.3.3. Instrucţiuni repetitive


Instrucţiunea repetitivă specifică faptul că anumite instrucţiuni urmează a
se executa în mod repetat. Dacă numărul de repetări e cunoscut dinainte
vei folosi instrucţiunea FOR altfel vor fi folosite instrucţiunile WHILE sau
REPEAT.

4.3.3.1. Instrucţiunea REPEAT...UNTIL

Poţi observa diagrama de sintaxă a instrucţiunii REPEAT în schema din


figura 4.8.

Figura 4.8

În cursul execuţiei instrucţiunii (care înseamnă repetă până când...),


expresie controlează repetarea execuţiei succesiunii de instrucţiuni din
cadrul instrucţiunii REPEAT. Expresie trebuie să dea un rezultat de tip
BOOLEAN.
Instrucţiunile aflate între cuvintele rezervate ale limbajului Pascal, REPEAT
şi UNTIL, se execută în succesiune repetat până când expresie
evaluată dă rezultatul TRUE.
Este important să reţii că succesiunea de instrucţiuni este executată cel
puţin o dată deoarece evaluarea pentru expresie este făcută după
execuţia succesiunii de instrucţiuni.

46
Instrucţiuni în Turbo Pascal

4.3.3.2. Instrucţiunea WHILE...

Poţi studia diagrama de sintaxă a instrucţiunii WHILE în figura 4.9.

Figura 4.9

Aşa cum vezi, instrucţiunea conţine o expresie care controlează repetarea


execuţiei unei instrucţiuni ( care poate fi o instrucţiune compusă).
Expresie trebuie să fie de tip BOOLEAN şi este evaluată înainte ca
instrucţiune să fie executată. Instrucţiune este executată repetat cât
timp expresie dă rezultatul TRUE; dacă expresie are valoare FALSE
de la început , instrucţiune nu se execută nici o dată.

4.3.3.3. Instrucţiunea FOR...

Analizează diagrama de sintaxă a instrucţiunii FOR prezentată în schema


din figura 4.10:

Figura 4.10

şi ţine cont că în schemă :


• Variabilă_control este un identificator de variabilă iar
valoare_iniţială şi valoare_finală sunt câte o expresie.
• Instrucţiunea FOR face ca instrucţiune ( care poate fi o instrucţiune
compusă) să se execute repetat cât timp variabilei de control i se atribuie
o progresie de valori cuprinse între valorile extreme ale variabilei de
control.
• Variabila de control trebuie să fie de unul din tipurile ordinale ;
valoare_iniţială şi valoare_finală trebuie să fie de un tip
compatibil din punct de vedere atributiv cu tipul variabilei de control.
• Când se intră într-o instrucţiune valorile iniţială şi finală sunt date ca
valori pentru tot restul execuţiei instrucţiunii FOR. Valorile finală şi iniţială
nu pot fi modificate în cursul execuţiei. Instrucţiunea controlată cu FOR se
execută o dată pentru fiecare valoare a variabilei de control.
• Variabila_control începe întotdeauna prin a avea valoarea egală
cu valoare_iniţială. Când instrucţiunea FOR foloseşte TO valoarea

47
Instrucţiuni în Turbo Pascal

variabilei de control creşte cu unu la fiecare repetare. Dacă valoarea


iniţială este mai mare decât valoarea finală, instrucţiune nu se
execută. Când instrucţiunea FOR foloseşte DOWNTO, valoarea variabilei de
control scade cu unu la fiecare repetare. Dacă valoarea iniţială este mai
mică decât valoarea finală, instrucţiune nu se execută.

Reţine : este eroare dacă instrucţiune schimbă valoarea variabilei de


control

4.4. Instrucţiunile de transfer de date: READ, READLN, WRITE,


WRITELN

Instrucţiunile din această categorie îţi asigură transferul datelor spre şi


dinspre calculator.

4.4.1. Instrucţiunile READ, READLN

Poţi face transferul datelor din fişierul standard de intrare în memoria


calculatorului prin apelarea procedurii READ conform diagramei de sintaxă
prezentate în figura 4.11:

Figura 4.11

Variabilele din listă pot aparţine doar tipurilor simple INTEGER, REAL,
CHAR. Prin execuţia operaţiei de intrare se preiau valori din fişierul
standard de intrare şi se atribuie variabilelor în ordinea dată de
lista_de_variabile.
Datele de intrare sunt considerate de program ca un flux continuu; o
operaţie de intrare preia o valoare de pe mediul de intrare din punctul
imediat următor ultimei valori preluate prin operaţia de intrare precedentă.
Reţine că o formă deosebită a operaţiei de intrare are sintaxa a cărei
schemă apare în figura 4.12

Figura 4.12

48
Instrucţiuni în Turbo Pascal

În acest caz se realizează, după transferul de valori din fişierul de intrare


la lista de variabile, o poziţionare la începutul liniei următoare ignorându-
se prin aceasta informaţia rămasă în linia curentă.
Procedura READLN fără listă_de_variabile nu realizează un
transfer de informaţie ci doar poziţionarea la începutul liniei următoare.

4.4.2. Instrucţiunile WRITE, WRITELN

Operaţia de ieşire se realizează prin apelarea procedurii WRITE conform


diagramei de sintaxă din figura 4.13. Spre deosebire de lista de intrare (
care este o listă de variabile) în lista_de_ieşire pot apare expresii.
Ca şi la intrare, datele de ieşire sunt transferate în flux continuu. Ele pot fi
structurate pe linii folosind procedura WRITELN care are diagrama de
sintaxă prezentată în figura 4.14.
Forma WRITELN (fără lista_de_ieşire ) realizează doar trecerea la
linia următoare în timp ce WRITELN( lista_de_ieşire ) scrie în linia
curentă valorile expresiilor din lista_de_ieşire după care face
trecerea la linia următoare.

Figura 4.13

Figura 4.14

o valoare booleană apare la ieşire sub forma şirului de caractere TRUE


sau FALSE

• o valoare întreagă apare ca un şir de cifre precedat, eventual, de semnul


(minus)

• o valoare reală apare la ieşire în virgulă mobilă normalizată conţinând o


mantisă şi un exponent.

Operaţia de ieşire permite specificarea numărului de poziţii în care se


transferă valoarea de ieşire.

49
Instrucţiuni în Turbo Pascal

• în cazul în care valoarea de ieşire este de tip INTEGER, CHAR sau


BOOLEAN se poate specifica un singur parametru şi anume lungimea
totală a zonei ca o expresie întreagă. În acest caz valoarea respectivă va
fi plasată în linia de ieşire aliniată la dreapta în zona de lungime
specificată. Dacă lungimea zonei este mai mică decât lungimea valorii de
tipărit, zona va fi extinsă pentru a afişa întreaga valoare.

• când valoarea de ieşire este de tip REAL sunt necesari doi parametri:
lungimea totală a zonei şi lungimea fracţiei. Dacă sunt specificaţi ambii
parametri, valoarea reală este scrisă fără exponent, cu punct zecimal şi
semn în zona rezervată, aliniată la dreapta, având partea fracţionară
rotunjită la numărul de cifre precizat ca lungime a fracţiei.
Exemplu:
valoarea din memorie x=-15.864 va apare la scrierea cu WRITE(x:6:1)
ca -15.9
Dacă vei specifica doar lungimea zonei, valoarea de tip REAL va
fi afişată normalizat având mantisa rotunjită astfel încât să încapă în
lungimea totală a zonei minus 6.
Exemplu:
WRITE(x:8) afişează, pentru aceeaşi valoare x de mai sus, -1.6 E+01
(unde - este semnul numărului, 1.6 este mantisa iar 01 puterea lui 10 cu
care trebuie înmulţită mantisa pentru a avea valoarea din memorie; deci
−1.6 ∗ 101).
Diagrama de sintaxă a procesului este prezentată în figura 4.15.

Figura 4.15

Programul prezentat mai jos utilizează instrucţiunile de scriere şi citire.

EX3.PAS
program plimbare;
var ore, min, sec, tplimbare : word;
begin
write(’ dati ora plecarii de acasa in ore minute
secunde’);
readln( ore, min, sec );
writeln(’plecare la: ’, ore:2, ’/’,min:2,’/’,sec:2);
write(’dati in secunde cat timp vreti sa va plimbati’);

50
Instrucţiuni în Turbo Pascal

readln(tplimbare);
writeln(’durata plimbarii:’,tplimbare:6,’secunde’);
sec:=sec+tplimbare; min:=min+sec div 60; sec:=sec
mod 60;
ore:=ore+min div 60;min:=min mod 60;
{ afisare moment sosire }
writeln(’veti sosi la: ’,ore:2, ’/’, min:2, ’/’,
sec:2);
end.

Vei introduce datele, întregi, cerute de acest program, fie câte una pe un
rând (valori numerice pentru oră ENTER, minut ENTER, secundă ENTER)
fie toate valorile numerice separate cu blanc pe un singur rând.

4.4.3. Fişiere de date

Când vei avea multe date de intrare sau ieşire (ca în cazul lucrului cu
matrici sau tabele de date) este recomandabil să foloseşti fişiere de date –
în locul introducerii datelor de la consolă ( vezi tipul FILE ).

4.4.3.1. Scrierea fişierelor

Un fişier, numit în continuare g este pregătit pentru scriere prin apelarea


procedurii
REWRITE(g).
Poţi realiza scrierea valorilor în fişier cu procedura
WRITE(g,x 1 , ..., x n )
unde în prima poziţie apare numele variabilei tip fişier iar valorile x 1 ,
..., x n trebuie să fie de acelaşi tip cu cel al componentelor fişierului g.
Programul prezentat în continuare scrie, la rând, în fişierul a
componentele unei matrici cu 10 linii şi 5 coloane. Editează programul,
compilează-l, execută-l apoi şi urmăreşte efectele instrucţiunii de scriere în
fişier.

EX4.PAS

program testfile1;
TYPE f=FILE OF real; {aici e definit tipul FILE}
VAR a:f;{variabila a este de tipul f definit mai sus}
x:array[1..10,1..5] of real;
i,j:byte;
BEGIN
assign(a,’testfile.dat’); rewrite(a);
for i:= 1 to 10 do
for j:= 1 to 5 do
begin
x[i,j]:=1.*i*j; {1. transforma i*j intr-o valoare
reala}
write(a,x[i,j]);
end;

51
Instrucţiuni în Turbo Pascal

close(a);
END.

4.4.3.2. Citirea fişierelor

Pregătirea unui fişier, f, pentru citire o poţi face apelând procedura


RESET(f )
Citirea datelor dintr-un fişier o vei face cu procedura standard
READ(f,a,b,c)
unde variabilele a,b,c trebuie să fie de acelaşi tip cu cel al componentelor
fişierului f.
În exemplul de mai jos se citeşte şi se scrie pe ecran matricea generată
de EX4.PAS. Execută programul apoi şi urmăreşte efectele instrucţiunii de
scriere.

EX5.PAS

program testfile2;
TYPE f=FILE OF real;
VAR a:f;
x:array[1..10,1..5] of real;
i,j:byte;
BEGIN
assign(a,’testfile.dat’); reset(a);
{citeste datele din fisierul ’testfile.dat’}
for i:=1 to 10 do
for j:=1 to 5 do read(a, x[i, j]);
{scrie datele citite pe ecran, o linie a matricei
pe un rând}
for i := 1 to 10 do
begin
for j := 1 to 5 do write(x[i, j]:6:1);
writeln;
end;
close(a); readln;
END.

Observă utilizarea ciclurilor “unul într-altul” ; ciclul după j este inclus în


ciclul după i . Observă de asemenea diferenţa între citirea datelor în flux
continuu, la rând, cu procedura READ şi scrierea lor ordonată în formă
standard de matrice . În al doilea caz ciclul după j, în care se scriu
elementele unei linii a matricei, este urmat de instrucţiunea WRITELN ce
realizează trecerea la linia următoare. În ciclul după i apar deci 2
instrucţiuni (ciclul după j şi WRITELN) ceea ce face necesară paranteza de
instrucţiune compusă BEGIN...END;

52
Instrucţiuni în Turbo Pascal

4.4.3.3. Câteva proceduri pentru manipularea fişierelor

SEEK
Sintaxa: SEEK(FilVar, n)
SEEK mută pointerul de fişier la a n-a componentă a fişierului asignat lui
FilVar. n este o expresie de tip întreg. Prima componentă a fişierului are
n=0. Extinderea fişierului asignat lui FilVar se poate face tot cu
procedura SEEK, în care n are valoarea numărul de componente din fişier
plus unu sau cu
SEEK(FilVar, FileSize(FilVar))

CLOSE
Sintaxa: CLOSE(FilVar)
Folosind această instrucţiune fişierul asignat variabilei FilVar va fi închis.
Reţine că este întotdeauna necesară aplicarea instrucţiunii CLOSE ori de
câte ori se încheie lucrul cu un fişier – inclusiv asupra fişierelor deschise
pentru citire.

4.4.3.4. Funcţii standard asupra fişierelor


EOF
Sintaxa: EOF(FilVar)
Această funcţia întoarce valoarea TRUE dacă pointerul de fişier este
poziţionat la sfârşitul fişierului, peste ultima componentă a fişierului. Altfel
întoarce FALSE.

FilePos
Sintaxa: FilePos(FilVar)
Funcţia întoarce poziţia curentă a pointerului de fişier în interiorul lui
FilVar. Reţine că prima componentă are numărul zero.

FileSize
Sintaxa: FileSize(FilVar)
Funcţia întoarce numărul de înregistrări din fişier.

Exerciţiul pe care îţi recomandăm să-l încerci, scrie date în fişierul f -


căruia îi vei da nume în cursul execuţiei. Poziţionează pointerul în
interiorul fişierului şi scrie apoi informaţiile referitoare la poziţia pointerului
şi câteva date

EX6.PAS
program testfile3;
var f : file of byte;
nume : string;
i, j : byte;
BEGIN
write(’introdu nume fisier: ’); {numele fişierului se
introduce in timpul execuţiei
programului}

53
Instrucţiuni în Turbo Pascal

readln(nume); assign(f,nume); rewrite(f);


for i := 1 to 15 do
begin
j := i * i; write(f, i, j);
end;
close(f); reset(f);
while not eof(f) do
begin
read(f, i, j); writeln(i : 3, j :4);
end;
write(’filesize(f)=’,filesize(f)); writeln; close(f);
reset(f); seek(f, 10); {poziţionare pointer la
sfârşitul înregistrării 10}
writeln(’filepos(f)=’, filepos(f)); {scrie poziţia
pointerului in fisier}
read(f, i, j); writeln(i, ’:’, j);
{ scrie înregistrările 11 si 12}
close(f);
END.

4.4.3.5. Fişiere de tip Text

Este important să reţii că fişierele descrise mai sus pot fi scrise sau citite
doar într-un program în Turbo Pascal - nu şi cu un editor DOS sau de alt
tip. În schimb, fişierele de tip TXT pot fi însă scrise sau citite şi în DOS sau
NotePad sau alte editoare de text.
Fişierele de tip TEXT sunt structurate în linii, fiecare linie se termină cu
End-Of-Line (EOL) iar fişierul se termină cu Enf-Of-File (EOF). Fişierele de
tip TEXT sunt fişiere secvenţiale. Operaţiile cu caractere se fac cu
procedurile READ şi WRITE. Liniile din fişier sunt procesate cu procedurile
READLN şi WRITELN. Sintaxa de declarare a unei variabile de tip fişier text
este:
VAR f:TEXT;

Editează, compilează şi execută următorul program care citeşte câte trei


coordonate a 10 puncte materiale şi masa acestor puncte din fişierul al
cărui nume este dat în timpul execuţiei programului. Programul scrie apoi
aceste date pe ecran sub formă de tabel, calculează coordonatele
centrului de masă al ansamblului acestor puncte materiale şi masa totală
şi scrie valorile determinate pe ecran.

EX7.PAS

program testfile4;
const n=10;
var f : text; nume:string;
x, y, z, m : array [1..n] of real;
xcm, ycm, zcm, mtot, sxm, sym, szm, sm : real;
i : byte;
BEGIN

54
Instrucţiuni în Turbo Pascal

write(’introdu nume fisier cu x, y, z, m ale celor n


puncte materiale’)
readln(nume); assign(f,nume); reset(f);
for i:= 1 to n do
readln(f, x[i], y[i], z[i], m[i]);
close(f); {scrie pe ecran datele citit}
writeln(’ i x y z m ’);
for i:= 1 to n do
writeln(i:5,x[i]:10:2,y[i]:10:2,z[i]:10:2,m[i]:10:2);
{iniţializare sume}
sxm :=0; sym :=0; szm:= 0; sm := 0;
for i := 1 to n do
begin
sxm := sxm + x[i] * m[i]; sym:=sym + y[i]*
m[i];
szm := szm + z[i]*m[i];sm:= sm+m[i];
end;
xcm:=sxm/sm; ycm:=sym/sm; zcm:=szm/sm; mtot:=sm;
{scrie pe ecran rezultatele}
writeln(’coordonatele centrului de masa sunt:);
writeln(’xcm=’,xcm, ’ycm=’, ycm, ’zcm=’,zcm);
writeln(’masa totala=’, mtot);
readln;
END.

Fişierul cu date de intrare, al cărui nume îl introduceţi în timpul execuţiei


programului, poate arăta astfel:
testfile4.in
1 2 3 4
2 3 4 5
3 4 5 6
4 5 6 7
5 6 7 8
8 7 6 5
7 6 5 4
6 5 4 3
5 4 3 2
4 3 2 1

55
Instrucţiuni în Turbo Pascal

4.5. Test de autoevaluare 1

1. Ce simbol se foloseşte pentru instrucţiunea de atribuire? Scrie un


exemplu de instrucţiune de atribuire în TP.

2. Denumeşte instrucţiunile condiţionale pe care le cunoşti şi


exemplifică folosirea în TP a fiecăreia dintre ele.

3. Scrie un program TP corespunzător algoritmului de calcul al mediei


aritmetice a 10 numere, prezentat în unitatea de învăţare 1.

4. Scrie un program TP corespunzător algoritmului de găsire a


termenului cu valoare maximă xmax dintr-un şir cu 10 termeni. Programul
va trebui să determine şi poziţia acestui termen în şir.

56
Instrucţiuni în Turbo Pascal

TTeesstt ddee aauuttooeevvaalluuaarree 11 -- C


Coonnttiinnuuaarree

5. Consideră polinomul P (x ) = am ⋅ x m + am −1 ⋅ x m −1 +  a1 ⋅ x + a0 dat prin


gradul său, m, şi coeficienţii ai. Elaborează un program TP pentru
determinarea valorii acestui polinom, pentru o valoare indicată a
variabilei x, x = x0.
Indicaţie: poţi elabora cu uşurinţă acest program, dacă revezi schema
logică prezentată în paragraful 2.4.2 din unitatea de învăţare 2.

6. Elaborează un program TP pentru ordonarea unui şir de numere care


să corespundă algoritmului A de la paragraful 1.4.4.

7. Scrie un program TP pentru ordonarea unui şir de numere care să


corespundă algoritmului B de la paragraful 1.4.4, citind datele din
fişierul tip text, ’date.in’; în acest caz, în prima linie a fişierului va fi dată
valoarea lui n şi din linia a doua vor fi date valorile xi

8. Elaborează un program TP pentru implementarea algoritmului Euclid


pentru determinarea divizorului comun maxim a două numere.

Răspunsurile la acest test le găseşti la pagina 58

57
Instrucţiuni în Turbo Pascal

4.6. Răspunsuri la testul de autoevaluare 1

1.Instrucţiunea de atribuire conţine simbolul atribuirii :=. Un exemplu este prezentat în


continuare radian := 1.5;
2. IF, CASE
3. Calculul mediei aritmetice
EX8.PAS
program valmedie;
const n=10;{se poate modifica pentru alt numar de valori x}
var x : array[1..n] of real;
s, xm : real;
i : byte;
begin
writeln(’ introdu ’, n, ’ valori x’);
for i:=1 to n do read(x[i]);
s:=0; for i:=1 to n do s:=s+x[i]; xm:=s/n;
writeln(’ xmediu = ’, xm:10:2);
end.
4. Găsirea termenului cu valoare maximă
EX9.PAS
program sir;
const n=10; {se modifica pentru alt numar de valori x}
var x:array[1..n] of integer;
xmax, imax, i:integer;
begin
writeln(’ introdu ’, n, ’ valori intregi ’);
for i:=1 to n do read(x[i]);
xmax:=x[1]; imax:=1;
for i:=2 to n do
if xmax < x[i] then
begin
xmax:=x[i]; imax:=i; end;
writeln(’ i x[i] ’);
for i:=1 to n do writeln(i:3,x[i]:10);
writeln(’ xmax= ’, xmax:10, ’ in pozitia ’, imax:3);
readln; {pentru a ramane in ecranul de lucru}{pentru a reveni
in editorul TP tastati ENTER}
end.

58
Instrucţiuni în Turbo Pascal

Testul de autoevaluare 1 - răspuns


5. Calculul valorii polinomului
EX10.PAS
program polinom;
var a : array[0..10] of real; {aceasta limiteaza gradul polinomului
la 10}
x0, p : real;
i, m : byte;
begin write(’ introdu gradul polinomului, m = ’); readln(m);
writeln(’ introdu coeficientii a[i] in ordinea i=m,...,0’);
for i := m downto 0 do read(a[i]);
write(’introdu x0=’); readln(x0);
p:=a[m];
for i:=m-1 downto 0 do p:=p*x0+a[i];
Writeln(’p(’, x0:5:1, ’)=’, p:10:2); readln;
end.
6. Ordonare A
EX11.PAS
program ordonareA;
var x:array[1..100] of integer;
i, j, n:byte; a:integer;
begin
write(’ introdu numarul de elemente:’); readln(n);
for i:=1 to n do
begin
write(’ introdu elementul intreg x[’,i:3,’ ]=’);
readln(x[i]);
end;
for j:=n-1 downto 1 do{asigura scaderea dimensiunii sirului}
for i:=1 to j do
if x[i]> x[i+1] then
begin
a:=x[i]; x[i]:=x[i+1]; x[i+1];=a;
end;
writeln(’ sirul ordonat este:’);
for i:=1 to n do writeln(x[i]:5);
readln;
end.

59
Instrucţiuni în Turbo Pascal

Testul de autoevaluare 1 - răspuns

7. Ordonare B
EX12.PAS
program ordonareB;
label unu; var x:array[1..100] of integer;
i, k, n:byte; a:integer; f:text;
begin
assign(f,’date.in’); {fisierul ’date.in’ trebuie sa existe in
directorul curent}
reset(f); readln(f, n);
for i:=1 to n do read(f, x[i]);
unu: k := 0;
for i:=1 to n do
if x[i]> x[i+1} then
begin
a:=x[i]; x[i]:=x[i+1]; x[i+1];=a;
k:=k+1;
end;
if k > 0 then goto unu; writeln(’ sirul ordonat este:’);
for i:=1 to n do write(x[i]:5,’ ’);
readln;
end.
8. Algoritmul Euclid
EX13.PAS
program euclid; var m, m1, n, n1, r : integer;
BEGIN
writeln(’ introdu m si n ca numere intregi, pozitive’); read(m,n);
m1:=m; n1:=n;{in m1 si n1 pastram valorile m si n distruse de
algoritmul lui Euclid}
if m < n then
begin
r:=m; m:=n; n:=r;
end;
while n <> 0 do {impartiri repetate}
begin
r:=m mod n; m:=n; n:=r;
end;
if m > 1 then
writeln(m1:5,’ si ’,n1:5,’ au cel mai mare divizor comun:’, m) else
writeln(m1:5,’ si ’,n1:5,’ nu au un divizor comun > 1’);
end.

60
Instrucţiuni în Turbo Pascal

4.7. Lucrare de verificare


Rezolvă problemele de mai jos. Trimite tutorelui răspunsurile pe care le consideri corecte.

1.Dă un exemplu de instrucţiune compusă. (0,5p)

2.Foloseşte instrucţiunea CASE... pentru a afla ultima zi din lună, oricare ar fi anul şi
luna ca date input. (0,5p)

3.Numeşte instrucţiunile repetitive pe care le cunoşti? (0,5p)

4.În ce ordine introduc datele xi când le citesc cu instrucţiunea


FOR i:=1 TO n DO read(x[i])? (0,5p)

5.În ce ordine introduc datele xi când le citesc cu instrucţiunea


FOR i:=n DOWNTO 1 DO read(x[i])? (0,5p)

6. crie, folosind REPEAT...UNTIL, următoarea secvenţă de program


while n<>0 do begin
r:= m MOD n; m:=n; n:=r;
end;
m şi n sunt două numere întregi şi pozitive, m > n, r este o variabilă
întreagă în care scriem restul împărţirii lui m la n. La ieşirea din ciclu
în m avem cel mai mare divizor comun al numerelor m şi n. (0,5p)

7.Înlocuieşte în EX7.PAS ciclurile for i:=1 to n do cu WHILE i <= n do... şi cu


REPEAT...UNTIL i > n (1p)

8.Elaborează programul care rezolvă ecuaţia de grad 2 a ⋅ x 2 + b ⋅ x + c = 0 cu orice


coeficienţi a, b, c. (2p)

9.Scrie programul care citeşte dintr-un fişier tip text valorile numărului de termeni
dintr-un şir şi termenii şirului xi şi găseşte termenul cel mai mic din şir xmin şi poziţia
sa în şir. (1p)

10.Consideră două matrici pătrate de ordin n ≤ 10. Elaborează un program TP în


care să citeşti dintr-un fişier tip text valorile n şi ai,j , bi,j cu i şi j mergând de la 1 la n
n
şi să calculezi matricea produs C, ale cărei elemente sunt date de c i , j = ∑ ai ,k ⋅ bk , j .
k =1
(2p)
Indicaţie: Reciteşte algoritmul pentru calculul unei sume.
În programul pe care-l vei elabora va trebui să foloseşti 3 cicluri: - ciclul după i (ciclul
exterior), pentru care i variază de la 1 la n şi indiciază liniile, - ciclul după j ( inclus în
ciclul după i) în care j variază şi el de la 1 la n şi este indicele coloanei; în acest ciclu
vei avea 3 instrucţiuni: iniţializarea lui s la zero, ciclul după k, în care se calculează
n

∑a
k =1
i ,k ⋅ bk , j şi instrucţiunea ci,j = s .

Ai grijă să plasezi corect parantezele de instrucţiune compusă.


Notă: se acordă un punct din oficiu. Total:10 puncte

61
Instrucţiuni în Turbo Pascal

4.8. Termeni şi expresii cheie

 Instrucţiune şi declaraţie în interiorul unui program TP


 Instrucţiuni de atribuire
 Instrucţiuni structurate ( compuse, condiţionate,
repetitive)
 Instrucţiuni pentru transferul datelor

4.9. Bibliografie

1. Anişoara Constantinescu, Simona Şerban, Victor Ionuţ Stoica, Limbajul


de programare Turbo Pascal Editura Anima, paginile 25-44.

62
Funcţii şi proceduri în Turbo Pascal

Unitatea de învăţare 5
FUNCŢII ŞI PROCEDURI ÎN TURBO PASCAL

Cuprins Pagina

5. FUNCŢII ŞI PROCEDURI ÎN TURBO PASCAL 63


5.1. Obiectivele Unităţii de învăţare 5 - Funcţii şi proceduri în Turbo Pascal 64
5.2. Proceduri 64
5.2.1. Variabile locale şi globale 65
5.2.2. Domeniul de valabilitate al obiectelor 66
5.2.3. Parametri 67
5.3. Funcţii 70
5.4. Parametri funcţii şi parametri proceduri 72
5.5. Recursivitate 74
5.6. Test de autoevaluare 1 76
5.7. Răspunsuri la testul de autoevaluare 1 77
5.8. Termeni şi expresii cheie. Formule cheie 79
5.9. Bibliografie 79
5.10. Lucrare de verificare 80

63
Funcţii şi proceduri în Turbo Pascal

5.1. Obiectivele Unităţii de învăţare 5 - Funcţii şi proceduri în Turbo


Pascal

Când vei termina de studiat acest capitol vei fi capabil :

să utilizezi diferite proceduri în elaborarea programelor


Turbo Pascal;

să operezi cu variabilele globale şi locale;

să cunoşti domeniul de valabilitate al obiectelor;

să defineşti funcţii proprii şi să le utilizezi în programele


Turbo Pascal;

să aplici atunci când este cazul mecanismul recursivităţii în


elaborarea unor programe Turbo Pascal.

Procedurile şi funcţiile îţi permit structurarea programelor complexe.


Fiecare procedură sau funcţie realizează complet o sarcină concretă în
cadrul programului în care apare. Fiecare declaraţie de procedură sau
funcţie, ce apare în partea declarativă a unui program, are un antet urmat
de un bloc. O procedură este activată printr-o instrucţiune de procedură,
iar o funcţie este activată ca orice funcţie standard.

5.2. Proceduri
O declaraţie de procedură asociază un identificator cu un bloc de
procedură. Diagrama de sintaxă pentru cazurile simple, pe care le vei
studia, este prezentată în figura următoare:

Figura 5.1

64
Funcţii şi proceduri în Turbo Pascal

Reţine că în antetul procedurii vei scrie identificatorul procedurii şi, dacă


trebuie, parametrii formali. În cadrul programului vei apela procedura prin
numele ei urmat de parametrii actuali – dacă aceştia există.

5.2.1. Variabile locale şi globale


Urmăreşte programul de mai jos, care simplifică o fracţie de numere
întregi ( dacă numărătorul şi numitorul au un divizor comun mai mare
decât unu). Vei vedea că se foloseşte o procedură (cmmdc) pentru
algoritmul de calcul al celui mai mare divizor comun al celor 2 numere
întregi. Poţi înţelege procedura pentru că aceasta a fost prezentată cu
algoritm, schemă logică şi program TP în unităţile de învăţare anterioare.
Deoarece algoritmul lui Euclid, folosit pentru găsirea celui mai mare divizor
comun al numerelor a şi b, modifică – în cursul execuţiei - semnificaţiile
Variabila numerelor iniţiale a şi b, acestea vor trebui copiate în x şi y. Poţi stabili cu
globală uşurinţă etapele programului:
este o • citirea şi afişarea numărătorului a şi numitorului b
variabilă a • copierea lui a în x şi a lui b în y
cărei • algoritmul lui Euclid cere x > y
valoare • calculul cmmdc pentru numerele x şi y
poate fi • dacă cmmdc > 1 atunci a şi b se împart la acesta
folosită şi • afişarea numărătorului şi numitorului simplificate
modificată
oriunde în EX14.PAS
program PROGRAM fractie;
{simplificare fractie a/b prin impartire cu cmmdc}
VAR a, b, x, y, z : INTEGER;
PROCEDURE cmmdc; {calcul cmmdc cu algoritmul lui
Euclid}
begin
if x < y then { asigurare x > y }
begin
z:=x; x:=y; y:=z;
end;
while y<>0 do {impartiri repetate}
begin
z:=x mod y; x:=y; y:=z;
end;
end; {end procedura cmmdc}
BEGIN {programul principal}
write(’introdu numaratorul si numitorul ca numere
intregi pozitive’);
readln(a,b);
writeln(’fractie nesimplificata: ’,a,’/’,b);
x:=a; y:=b; cmmdc; {apelare procedura cmmdc}
if x>1 then{simplificare fractie}
begin
a:=a div x; b:=b div x;
writeln(’fractie simplificata: ’,a,’/’,b);
end
else writeln(’fractia nu se poate simplifica’);
END.

65
Funcţii şi proceduri în Turbo Pascal

Observă că în exemplul de mai sus declaraţia de procedură nu conţine o


parte de declaraţie de variabile; toate variabilele, declarate în programul
principal, vor fi considerate şi în procedură. Astfel de variabile sunt numite
variabile globale.
Există posibilitatea de a scrie o parte de declaraţie în interiorul procedurii
la fel ca în orice program în Turbo Pascal. Identificatorii introduşi în partea
de declaraţie a procedurii sunt locali, ei pot fi referiţi şi cunoscuţi numai în
blocul în care au fost declaraţi, blocul reprezentând domeniul acestor
identificatori.
Poţi scrie programul de mai sus folosind variabilele locale, în modul
următor:

EX15.PAS
PROGRAM fractie2;
VAR a, b, c : integer; {variabile globale}
PROCEDURE cmmdc;
VAR x, y, z : integer; {variabile locale}
begin
Variabila x:=a; y:=b;
locală este if x < y then
o variabilă begin
de program z:=x; x:=y; y:=z;
al cărei end;
domeniu de while y <> 0 do
valabilitate begin
este z:= x mod y; x:=y; y:=z;
restricţionat end;
la un blocul c:=x; { cmmdc e transmis intr-o variabila globala}
de cod în end; {end cmmdc}
care a fost
definită BEGIN {programul principal}
write(’introdu numaratorul si numitorul ca numere
intregi pozitive’);
readln(a,b);
writeln(’fractie nesimplificata: ’,a,’/’,b);
cmmdc; {apelare procedura cmmdc}
if c>1 then {simplificare fractie}
begin
a:=a div c; b:=b div c;
writeln(’fractie simplificata: ’,a,’/’,b);
end {atentie nu puneti ; inainte de else}
else writeln(’fractia nu se poate simplifica’);
END.

5.2.2. Domeniul de valabilitate al obiectelor

Fiecare corp de procedură poate conţine în partea sa de declaraţie o


declaraţie de procedură sau funcţie ( numită procedură sau funcţie inclusă
sau locală). Prin obiecte înţelegem constante, tipuri, variabile, proceduri,
funcţii identificate prin identificatorul asociat.
Reţine regulile ce determină domeniul de valabilitate şi durata de viaţă ale
unui identificator:

66
Funcţii şi proceduri în Turbo Pascal

1. domeniul unui identificator îl constituie blocul în care a fost declarat şi


toate blocurile incluse în acest bloc

2. dacă un identificator a, declarat într-un bloc x, este redeclarat într-un


bloc y atunci blocul y şi blocurile incluse lui se exclud din domeniul de
valabilitate al identificatorului a, declarat în x. Urmăreşte acest «joc» în
programul prezentat mai jos

EX16.PAS
program test_var;
var x, y:real;
procedure citit_scris;
var x, u:real;
begin
write(’ introdu x si u, numere reale: ’); readln(x, u);
writeln(’ x=’,x:5:1; ’u=’,u:5:1);
end;
begin
write(’ introdu x si y, numere reale: ’);
readln(x, y);
citit_scris; writeln(’x=’,x:5:1, ’y=’,y:5:1);
end.

Dacă ai introdus x=1.5, y=2.5 şi apoi x=10.5 şi u=20.5 pe ecran va apare:

x= 10.5 u= 20.5
valorile citite şi scrise în procedura citit_scris
x=1.5 y=2.5
valorile citite înainte de apelarea procedurii şi
scrise după apelarea ei.

3. identificatorii de proceduri se supun aceloraşi reguli de domeniu ca şi


ceilalţi identificatori, deci o procedură poate fi folosită doar în blocul în care
ea a fost declarată şi în blocurile incluse în acesta

4. o procedură se poate referi la ea însăşi (apelare recursivă)

Regulile 1÷4 determină durata de viaţă a identificatorilor. Reţine că o


variabilă declarată ca locală într-o procedură există numai în timpul
execuţiei procedurii fiind creată la activarea procedurii prin alocarea de
memorie şi distrusă la ieşirea din procedură prin eliberarea memoriei
ocupate.

5.2.3. Parametri
Folosirea parametrilor formali îţi permite apelarea aceloraşi proceduri în
etape diferite ale programului, cu valori diferite ale variabilelor.
Un parametru formal reprezintă un obiect local al procedurii. Observă lista
parametrilor formali prezentată în diagrama de sintaxă în figura 5.2.

67
Funcţii şi proceduri în Turbo Pascal

Figura 5.2

Este important să reţii că există trei feluri de parametri (valoare, variabile,


variabile fără tip) caracterizaţi astfel:

1. un grup de parametri care la declarare sunt separaţi prin virgulă, fără a


fi precedaţi de cuvântul cheie VAR dar urmaţi de identificatorul de tip.
Ansamblul lor este o listă de parametri valoare.

2. un grup de parametri care la declarare sunt separaţi prin virgulă, sunt


precedaţi de cuvântul cheie VAR şi sunt urmaţi de identificatorul de tip.
Ansamblul lor este o listă de parametri variabile.

3. un grup de parametri care la declarare sunt separaţi prin virgulă, sunt


precedaţi de cuvântul cheie VAR dar nu sunt urmaţi de identificatorul de
tip. Ansamblul lor este o listă de parametri variabile fără tip.

Urmăreşte rolul fiecărui tip de parametru :

1. Un parametru formal valoare acţionează ca o variabilă locală pentru


procedură cu diferenţa că la activarea procedurii îşi ia valoarea iniţială din
parametrul actual corespunzător. Din această cauză se mai numeşte şi
parametru de intrare. Modificările făcute asupra parametrului formal
valoare în procedură nu afectează valoarea parametrului actual
corespunzător. Parametrul actual trebuie să fie de un tip compatibil
atributiv cu tipul parametrului formal valoare.

2. Un parametru formal variabilă este folosit când valoarea trebuie


transferată de la procedură la programul apelant. Parametrul actual
corespunzător în instrucţiunea procedură (care activează procedura )
trebuie să fie o referire de variabilă. Orice schimbări ale parametrului
formal variabilă sunt reflectate în parametrul actual. Tipul parametrului
actual trebuie să fie identic cu tipul parametrului formal variabilă (această
restricţie se poate evita prin folosirea unor parametri formali fără tip).

3. Când un parametru formal este o variabilă fără tip, parametrul actual


corespunzător poate fi orice referire de variabilă indiferent de tipul ei.

Studiază programele EX17.PAS şi EX18.PAS. Ele reprezintă rescrierea


programului fracţie2 cu procedura cmmdc, cu parametri valoare şi apoi
cu parametri valoare şi variabile.

68
Funcţii şi proceduri în Turbo Pascal

EX17.PAS
PROGRAM fractie3;
VAR a, b, c : integer;
PROCEDURE cmmdc(x, y:integer);
{x si y sunt parametrii valoare}
VAR z:integer;
begin
if x < y then
begin
z:=x; x:=y; y:=z;
end;
while y < > 0 do
begin
z:=x mod y; x:=y; y:=z;
end;
c:=x;
{ cmmdc e transmis intr-o variabila globala c}
end; { end cmmdc}

BEGIN {program principal}


write(’ introdu a si b, numere intregi, pozitive’);
readln(a,b);
writeln(’fractie nesimplificata: ’,a,’/’,b);
cmmdc(a,b);
if c > 1 then
begin
a:= a div c; b:=b div c;
writeln(’fractia simplificata: ’,a,’/’,b);
end
else writeln(’cmmdc=’,c); readln;
END.

O nouă formă a programului , cu parametri valoare şi variabile.

EX18.PAS
PROGRAM fractie4;
VAR a, b, c :integer;
PROCEDURE cmmdc(x, y :integer; VAR w:integer);
{x si y sunt parametri valoare, w este parametru
variabila}
VAR z:integer;
PROCEDURE swap;
begin
z:=x; x:=y; y:=z;
end; {end swap}
begin {begin cmmdc}
if x < y then swap; while y < > 0 do
begin
z:=x mod y; x:=y; y:=z;
end;
w:=x
end; {end cmmdc}

69
Funcţii şi proceduri în Turbo Pascal

BEGIN {program principal}


write(’ introdu a, b numere intregi, pozitive’);
readln(a, b);
writeln( ’fractia nesimplificata: ’,a,’/’,b);
cmmdc(a, b, c);
if c > 1 then
begin
a:= a div c; b:=b div c;
writeln(’fractie simplificata:’, a, ’/’,b);
end
else writeln(’cmmdc=’,c);
readln;
END.

5.3. Funcţii

În afara funcţiilor standard poţi defini funcţii proprii. Diagrama de sintaxă


pentru declararea unei funcţii este următoarea:

Figura 5.3

Este important să reţii următoarele caracteristici specifice funcţiilor:


• lista parametrilor formali conţine doar parametrii valoare (ei având rolul
datelor de intrare din declaraţia de procedură) şi parametrii variabilă fără
tip.
• tip_rezultat apare în plus faţă de declaraţia de procedură şi
specifică tipul rezultatului transmis prin numele funcţiei.

Deoarece corpul funcţiei este un bloc, el poate include declaraţii de


constante, tipuri, variabile, proceduri şi funcţii locale. În partea executabilă
a funcţiei trebuie să apară cel puţin o atribuire prin care se transferă
identificatorului funcţiei valoarea rezultatului calculat.
Apelarea (activarea) funcţiei o vei face conform diagramei de sintaxă din
figura 5.4:

Figura 5.4

70
Funcţii şi proceduri în Turbo Pascal

Exemplu:
Programul de mai jos determină cele 4 rădăcini reale ale ecuaţiei
x4 − 9x3 − 2x2 + 120x − 130 = 0. ( 5.1)
atunci când sunt date intervalele în care se află rădăcinile. Programul
conţine o funcţie care defineşte pe f (x ) din ecuaţia f ( x ) = 0 şi o
procedură care găseşte rădăcina ecuaţiei în intervalul dat de valorile
parametrilor actuali ce înlocuiesc pe a şi b la apelarea procedurii şi scrie
pe ecran această valoare. Pentru lămuriri suplimentare poţi consulta
referinţa bibliografică [5] .

EX19.PAS
PROGRAM rezec4;
LABEL zero;
VAR a, b : real; i:byte;
ai:array[1..4] of real;
{limita inferioara a intervalului in care se afla
o radacina}
bi:array[1..4] of real;
{ limita superioara a intervalului in care se
afla o radacina}
FUNCTION f(x:real):real;
begin
f:=sqr(x)*sqr(x) - 9*sqr(x)*x - 2*sqr(x) +
120.*x - 130.
end;
PROCEDURE solutie(a,b:real; i:byte);
label unu, doi;
CONST eps=1.E-05;
var c:real;
begin
unu: c:=(a+b)/2;
if f(c)=0 then
begin
writeln(’ x(’,i:2,’)=’,c); goto doi;
end;
if f(a)*f(c) < 0 then b:=c else a:=c;
if abs(b-a)<eps then
begin
writeln(’ x(’,i:2,’)=’,(a+b)/2); goto doi;
end
else goto unu;
doi: end;
BEGIN {main program}
writeln(’ introdu limitele a, b pentru cele ’);
writeln(’ 4 intervale in care se afla o radacina:’);
writeln(’ (-4., -3.), (1., 2.), (4., 5.), (7., 8.)
’);
for i:= 1 to 4 do
begin
zero: readln(a, b);
{ verifica corectitudinea intervalelor}
if f(a)*f(b) > 0 then

71
Funcţii şi proceduri în Turbo Pascal

begin
writeln(’intervaldat gresit,reintrodu a si b: ’);
goto zero;
end;
ai[i]:=a; bi[i]:=b;
end;
for i:=1 to 4 do solutie(ai[i], bi[i],i);
readln;
END.

5.4. Parametri funcţii şi parametri proceduri

O procedură sau funcţie poate apela o altă procedură sau funcţie dacă
aceasta din urmă a fost deja declarată.
Sunt însă situaţii în care numele şi efectul procedurii sau funcţiei apelate
nu îţi sunt cunoscute la scrierea procedurii sau funcţiei apelante ci doar în
momentul execuţiei programului. În aceste cazuri numele
procedurii/funcţiei apelate va fi transmis ca parametru.
De exemplu, funcţia ce calculează prin metoda Simpson integrala
b

∫ f ( x )dx
a
( 5.2)

va avea antetul:
FUNCTION simpson(a, b:real; n:integer; f:fct):real;
Tipul fct este definit în programul apelant astfel:
TYPE fct=function(x:real):real;
Parametrii formali funcţii şi procedură pot fi numai parametri de tip valoare.
Funcţiile şi procedurile standard nu pot fi transmise ca parametri actuali.
La apelarea unei funcţii/proceduri care are printre parametri formali o
funcţie sau procedură, parametrul actual corespunzător trebuie să fie un
identificator de funcţie sau procedură.
Reţine că folosirea parametrilor de tip procedură sau funcţie se face sub
controlul directivei de compilare {$F+} aşezată fie înainte de antetul
programului fie înaintea declarării funcţiei actuale şi, în acest ultim caz, se
foloseşte la sfârşitul declarării funcţiei directiva de compilare {$F-}.
Exemple
1. Calculează, folosind metoda Simpson [6], integrala
π/2

K (θ ) = ∫
0 1 − sin (θ ) ⋅ sin 2 (φ )
2
( 5.3)

pentru θ = 30 şi 60 grade.
Programul ce îţi este prezentat în continuare realizează calculul cerut.

EX20.PAS
Program calcul_int_simpson;
const pi=3.14159;
type fct=function(x:real):real;
var a, b, t1, t2, t, s1, s2:real;
{$F+} function k(x:real):real;
begin
k:=1/sqrt(1-sin(t)*sin(t)*sin(x)*sin(x))

72
Funcţii şi proceduri în Turbo Pascal

end;
{$F-}
function simpson(a,b:real;n:integer; f:fct):real;
var s, h:real; i:integer;
begin
h:=(b-a)/n/2; s:=f(a)+f(b); i:=1;
while i<2*n do
begin
if i mod 2 = 0 then s:=s + 2*f(a+i*h)
else s:=s + 4*f(a+i*h);
i:=i+1;
end;
simpson:=s*h/3;
end; {end simpson}

BEGIN { incepe programul principal}


a:=0; b:=pi/2;
t1:=30; t:=t1*pi/180; s1:=simpson(a, b, 10, k);
t2:=60; t:=t2*pi/180; s2:=simpson(a, b, 10, k);
writeln(’K(’,t1:4:1,’)=’,s1);
writeln(’ K(’,t2:4:1,’)=’,s2); readln;
END.

Îţi recomand să salvezi funcţia simpson într-un fişier cu numele


simpson.inc. De câte ori vei avea nevoie de ea vei folosi directiva de
compilare {$i simpson.inc} înainte de BEGIN (programul principal);
în acest fel nu mai este nevoie să tastezi din nou funcţia Simpson.

2. Calculează integrala
1
x7 1 − x 2
I= ∫ 13
dx ( 5.4)
−1 (2 − x )2

Dacă vei folosi funcţiile xp(x:real; p:integer):real, pentru


ridicarea lui x la o putere întreagă, fs pentru funcţia de sub semnul
integralei şi simpson pentru calculul integralei atunci programul care
rezolvă problema propusă se poate scrie:

EX21.PAS
Program calcul_integrala;
type fct=function(x:real):real;
var a, b, s1:real;
function xp(x:real; p:integer):real;
var i:integer; px:real;
begin
px:=1; for i:=1 to p do px:=px*x; xp:=px;
end;
{$F+} function fs(x:real):real;
begin
fs:=xp(x,7)*sqrt(1-sqr(x))/sqrt(xp(2-x,13));
end;
{$F-}

73
Funcţii şi proceduri în Turbo Pascal

{$i simpson.inc}

BEGIN
s1:=simpson(-1.,1.,10,fs);
writeln(’ integrala este: ’,s1);
readln;
END.

5.5. Recursivitate

Exemple:

• pentru numerele naturale, factorialul


n! = n * (n - 1)!

0! = 1 ( 5.5)
n > 0

• în ecuaţiile fizicii matematice , polinoamele Legendre

 1
Pm (u ) = m [u (2 m − 1)Pm −1 (u ) − (m − 1)Pm −2 (u )]

P0 (u ) = 1 ( 5.6)
P (u ) = u
 1

Apel recursiv înseamnă folosirea numelui procedurii (funcţiei) în cadrul
textului procedurii (funcţiei); apelul recursiv este permis în Turbo Pascal.
Puterea recursivă stă în posibilitatea de a defini o mulţime infinită de
obiecte printr-o declaraţie finită; un număr infinit de calcule poate fi descris
printr-un program recursiv finit chiar dacă programul nu conţine repetiţii
explicite. Pentru terminarea programului, apelarea recursivă a unei
proceduri trebuie condiţionată fie printr-o condiţie ce la un moment dat
devine falsă fie asociind procedurii un parametru n şi apelând-o recursiv
cu parametrul n-1.
Studiază cele două exemple de mai jos.

Fiind dat un număr întreg şi pozitiv scrie numărul obţinut prin citirea cifrelor
numărului dat de la dreapta la stânga (numărul răsturnat).

EX22.PAS
program nr_rasturnat;
var n : longint;
procedure invers(n : longint);
begin
write(n mod 10);
if n div 10<> 0 then invers(n div 10);
end; {end procedura invers}

74
Funcţii şi proceduri în Turbo Pascal

begin
write(’ introdu numarul intreg: ’); readln(n);
writeln(’numarul dat este: ’,n);
write(’numarul rasturnt este: ’); invers(n);
readln;
end.

2. Calculează
n!
C nk =
(n − k )! k !
folosind forma recursivă a funcţiei fact(n)
Cnk = fact(n)/fact(n-k)/fact(k)

EX23.PAS
program combnk;
var n,k : byte; c : real;
FUNCTION fact(n:byte):longint;
begin
if n=0 then fact:=1 else fact:=n*fact(n-1);
end; {end functia fact}
begin
write(’ introdu n si k pentru a calcula combinari de
n luate cate k’);
readln(n, k);
c:= fact(n)/ fact(n-k)/ fact(k);
writeln(’comb. de ’, n:3, ’ luate cate
’,k:3,’=’,c:10:2);
readln;
end.

Este important să reţii că recursivitatea poate fi întotdeauna transformată


în iteraţie. În majoritatea cazurilor forma nerecursivă a unui program este
mai eficientă decât forma recursivă în ceea ce priveşte timpul de execuţie
şi memoria ocupată. Varianta recursivă este preferată acolo unde
înlocuirea ei cu iteraţia ar cere un efort deosebit sau tehnici speciale de
programare, algoritmul pierzându-şi claritatea exprimării.
Un exemplu în care folosirea funcţiei recursive e justificată este problema
partiţiilor unui număr natural N.
Prin partiţie a unui număr N se înţelege totalitatea posibilităţilor de
exprimare a numărului N ca o sumă de alte numere naturale, fiecare din
ele nedepăşind o valoare M.
Ataşează numărului de partiţii o funcţie P(n, m) definită astfel:

P(n, m) = 1 dacã m = 1
 sau n = 1

 ( 5.7)
P(n, m) = 1 + P(n, n - 1) dacã n ≤ m
P(n, m) = P(n, m - 1) + P(n - m, m) dacã n > m

75
Funcţii şi proceduri în Turbo Pascal

Varianta iterativă de implementare ar fi greoaie în timp ce varianta


recursivă este foarte simplă.

EX24.PAS

program partitii;
uses crt;
var L, k:integer;
function p(n, m:integer):longint;
begin
if (n=1) or (m=1) then p:=1
else
if n<=m then p:=1 + p(n, n-1)
else p:= p(n, m-1) + p(n-m, m); {observati acest
else legat de if imediat anterior}
end;{end function p}
begin {program principal}
clrscr;
write(’introdu n si m, intregi si pozitive, n>m ’);
readln(L, K);
writeln(’ numar de partitii p(’, L:3,’,’, K:3,’)=’,
p(L,K));
readln;
end.
Observă aici necesitatea de a scrie (n=1) şi (m=1) pentru că operatorul de
relaţie (=) are prioritate mai mică decât operatorul or (vezi tabelul de la
paragraful 3.5). Exemple cunoscute de apelare recursivă justificată sunt
programele ce rezolvă probleme ca turnurile din Hanoi şi aşezarea pe
tabla de şah a opt regine.

5.6. Test de autoevaluare 1

1. Unde sunt declarate şi definite procedurile şi funcţiile într-un


program TP?

2. Care este principala deosebire între o procedură şi o funcţie?

3. Care este deosebirea între variabilele globale şi cele locale ?

76
Funcţii şi proceduri în Turbo Pascal

4. Defineşte recursivitatea.

5. Elaborează un program care să afişeze toate permutările de n


elemente

Răspunsurile le găseşti la pagina 77

5.7. Răspunsuri la testul de autoevaluare 1

1. Procedurile şi funcţiile apar în partea declarativă a programului,


imediat după variabilele globale.
2. Procedurile sunt activate printr-o instrucţiune de procedură în timp
ce funcţiile sunt activate ca orice funcţie standard.
3. Variabila locală este o variabilă de program al cărui domeniu de
valabilitate este restricţionat la blocul de cod în care a fost declarată.
Variabila globală este o variabilă declarată în programul principal, a
cărei valoare poate fi folosită şi modificată oriunde în program – chiar
şi într-un bloc inclus – dacă nu a fost redeclarată în acesta. O
variabilă cu acelaşi nume declarată într-un bloc, are valoarea
respectivă în interiorul blocului. La părăsirea blocului variabila reia
valoarea din programul principal. Exemplul EX16.PAS
4. Recursivitatea este capacitatea unei rutine de a se autoapela.
Utilizarea eronată a recursivităţii poate aduce un program în situaţia
de a nu mai avea spaţiu pentru execuţie blocându-l astfel.

77
Funcţii şi proceduri în Turbo Pascal

R
Răăssppuunnssuurrii llaa tteessttuull ddee aauuttooeevvaalluuaarree --
C
Coonnttiinnuuaarree
5. PROGRAM permutari scrise
USES CRT
CONST lim=20;linii_in_pagina=22
VAR n,l:Integer;a:Array[1..lim] of 1 ..lim;
Procedure permutari(k:Integer);
Var I,x:integer;c:Char;
BEGIN
If k=1 then
Begin
If l> linii_in_pagina Then
Begin write (‘Apasa o tasta‘)
c:= readkey;clrscr;l:=0
end;
For i:=1 to n
Do write(a[i]:2,’’);writeln;l:=l+1
End
Else
For i:=1 to k do
Begin
x:=a[i]; a[i]:=a[k];a[k]:=x;
Permutari(k-1)
x:=a[i]; a[i]:=a[k];a[k]:=x;
End
End;
Begin {program principal}
Writeln(’ scrie permutarile d n elemente’)
Write ( ’n=’);readln(n)
For l:=1 to n Do
a[l]:=l;l:=2;
permutari(n)
End

78
Funcţii şi proceduri în Turbo Pascal

5.8. Termeni şi expresii cheie. Formule cheie

Termeni şi expresii cheie


 Proceduri;
 Variabile locale; variabile globale;
 Domeniul de valabilitate al obiectelor;
 Parametru valoare; parametru variabilă;
parametru variabilă fără tip;
 Funcţii definite de utilizator;
 Recursivitate.

Formule cheie
n! = n * (n - 1)!

 Proprietăţile recursive ale factorialului 0! = 1
n > 0

 Recursivitatea Polinoamelor Legendre
 1
Pm (u ) = m [u (2 m − 1)Pm −1 (u ) − (m − 1)Pm −2 (u )]

P0 (u ) = 1
P (u ) = u
 1

5.9. Bibliografie
1. Anişoara Constantinescu, Simona Şerban, Victor Ionuţ Stoica, Limbajul
de programare Turbo Pascal Editura Anima, paginile 69-88.

79
Funcţii şi proceduri în Turbo Pascal

5.10. Lucrare de verificare

Rezolvă problemele de mai jos. Trimite tutorelui răspunsurile pe care le


consideri corecte

1. Care este deosebirea între parametrii valoare şi parametrii


variabile? (1p)

2. Când trebuie folosiţi parametri procedurali? (1p)

3. Scrie un program care să conţină o procedură pentru calculul unei


sume de valori . Programul va trebui să folosească această
procedura de calcul al sumei pentru a face sumele din programul aflat
în fişierul EX7.PAS (3p)
4. Elaborează un program care:

– să conţină o procedură de înmulţire a două matrici


procedure promat(x:matrice; lx, cx:byte; y:matrice;
ly, cy:byte; VAR z:matrice; VAR lz, cz:byte);
tipul matrice e definit în programul principal type
matrice=array[1..10,1..10] of real;
– să citească dintr-un fişier tip text date despre matricea a:
la=numărul de linii, ca=numărul de coloane şi a[i, j]=elementele
matricei a (i=1...la, j=1...ca)
– să citească din acelaşi fişier date despre matricea b:
lb=număr de linii, cb=număr de coloane şi b[i, j]=elementele matricei
b (i=1...lb, j=1...cb)
– să citească din acelaşi fişier date despre matricea c:
lc=număr de linii, cc=număr de coloane şi elementele matricei c[i,
j](i=1...lc, j=1...cc)

– să calculeze matricea produs d=a*b şi apoi matricea produs e=d*c


folosind procedura promat

– să scrie cele 2 matrici produs, d şi e într-un fişier text.


(4p)
Indicaţii :
a) Redactează răspunsurile folosind un editor de texte
b) Pentru itemul 4 pregăteşte un fişier care să conţină matricile pe
care le operezi. Scrie rezultatul executării programului într-un
fişier text. Introdu în textul răspunsurilor conţinutul fişierului cu
date de intrare şi conţinutul fişierului cu date de ieşire.

Notă: se acordă un punct din oficiu Total 10 puncte

80
Grafică în Turbo Pascal

Unitatea de învăţare 6
Grafică în turbo pascal

Cuprins Pagina

6. GRAFICĂ ÎN TURBO PASCAL 81


6.1. Obiectivele Unităţii de învăţare 6 – Grafica în Turbo Pascal 82
6.2. Unit-uri standard 82
6.3. Unit-ul GRAPH 83
6.3.1. Iniţializarea modului grafic 83
6.3.2. Tratamentul erorilor grafice 85
6.3.3. Definirea ferestrelor în grafica TP 85
6.3.4. Reprezentarea punctelor în grafica TP 86
6.3.5. Reprezentarea liniilor- culori, stiluri grosimi; deplasarea în fereastra 87
6.3.6. Reprezentarea cercului a elipsei Umplerea suprafeţelor închise. 88
6.3.7. Reprezentarea liniilor poligonale 89
6.3.8. Scrierea grafică 90
6.4. Test de autoevaluare 1 96
6.5. Răspunsuri la testul de autoevaluare 1 97
6.6. Termeni şi expresii cheie. 98
6.7. Lucrare de verificare 98
6.8. Bibliografie 98

81
Grafică în Turbo Pascal

6.1. Obiectivele Unităţii de învăţare 6 – Grafica în Turbo Pascal

Când vei termina de studiat acest capitol vei fi capabil :

să utilizezi proceduri din UNIT-ul GRAPH

să operezi cu ferestre în ecranul grafic TP – stabilindu-le


dimensiunile, culorile precum şi caracteristicile obiectelor
grafice interioare

să cunoşti modul de stabilire a proprietăţilor pentru punct,


linie, cerc, linie poligonală.

să aplici cunoştinţele dobândite pentru a desena pe ecranul


grafic TP figuri şi grafice.

Pentru grafica în TP se foloseşte unit-ul GRAPH. Prin unit vei înţelege o


colecţie de constante, declaraţii de tip şi variabile, proceduri şi funcţii, care
poate fi compilată separat şi care poate fi utilizată de un program principal
prin specificarea numelui unit-ului într-o clauză uses. Lungimea unui unit
este limitată la 64Kb dar un program poate folosi un număr arbitrar de
unit-uri funcţie doar de memoria disponibilă a calculatorului folosit. Prin
utilizarea unit-urilor creşte viteza de compilare.

6.2. Unit-uri standard


Există opt unit-uri standard în Turbo Pascal, fiecare cu un profil şi o
structură bine delimitate: SYSTEM, DOS, OVERLAY, CRT, GRAPH,
PRINTER, GRAPH3, TURBO3.

• Unit-ul System conţine toate procedurile şi funcţiile standard din Turbo


Pascal. El se încorporează automat în toate programele fără a fi necesară
o clauză Uses pentru el;

• Unit-ul Dos conţine proceduri şi funcţii echivalente cu apelurile DOS cele


mai obişnuite: citire de date, sistemul de întreruperi, etc. Folosirea lui se
face cu clauza Uses Dos;

• Unit-ul Overlay permite folosirea tehnicii de scriere a programelor mari


din bucăţi. Se foloseşte cu clauza Uses Overlay;.

Aceste trei unit-uri se găsesc în fişierul Turbo.tpl

82
Grafică în Turbo Pascal

Unit-ul Crt (character) permite utilizarea funcţiilor şi procedurilor pentru


comanda funcţionării ecranului alfanumeric: ştergerea ecranului cu
procedura clrscr (clear screen), funcţiile KeyPressed:boolean; şi
ReadKey:char. Pentru anunţarea folosirii unitului vei folosi clauza Uses
crt după antetul programului.

• Unit-ul Graph conţine procedurile şi funcţiile grafice. Acest unit se


află în fişierul Graph.tpu. Subprogramele din acest unit au nevoie de
informaţiile din fişiere de tipul *.BGI şi *.CHR.

Îţi vei anunţa intenţia de folosire în programul pe care-l construieşti a


unitului Graph prin scrierea (după antetul programului) a clauzei Uses
Graph;

• Unit-ul Printer permite redirectarea scrierilor în fişierul text cu numele lst


direct la imprimantă.

• Unit-urile Graph3 şi Turbo3 permit folosirea subprogramelor grafice din


versiunea a 3-a a compilatorului Turbo Pascal.

Exemplu: Uses Dos, Crt, Graph;

Programele în Turbo Pascal permit atât folosirea unit-urilor standard


enumerate mai sus cât şi scrierea şi folosirea unor unit-uri personale, pe
care ţi le poţi construi .

6.3. Unit-ul GRAPH

Programele care utilizează subprogramele din acest unit trebuie să aibă


directiva Uses Graph; după antetul programului.
Subprogramele din unit-ul Graph realizează:

1. iniţializarea modului grafic

2. tratarea erorilor grafice

3. definirea de ferestre şi pagini

4. reprezentarea punctelor

5. reprezentarea liniilor

6. reprezentarea de cercuri şi alte curbe

7. reprezentarea de poligoane şi haşurări

8. scrierea grafică

Dimensiunile ecranului grafic folosit de TP şi modul în care sunt fixate


coordonatele pe acest ecran rezultă din imaginea din figura 6.1. Toate
dimensiunile sunt date în pixeli.

83
Grafică în Turbo Pascal

Pixel:
Prescurtare de la picture PIX ELEment. Element de imagine.
Fiecare pixel este unul din punctele care formează reţeaua
bidimensională a unei imagini plane pe hârtie sau monitor. Fiecare
pixel este desenat individual pentru a compune imaginea totală de
pe hârtie sau ecran. Pixelul este elementul ultim pe care hardware-
ul sau software-ul de afişare sau tipărire îl pot manipula.

Figura 6.1 Ecranul pentru grafică Turbo Pascal

6.3.1. Iniţializarea modului grafic

Pentru a iniţializa modul grafic poţi folosi următoarea secvenţă de


instrucţiuni:

1.procedure grstart;
begin
gd:=detect; InitGraph(gd, gm, ’\TP\BGI’);
If graphresult <>grok then halt(1);
end;

Trebuie să te asiguri că ai plasat antetul procedurii InitGraph:

Procedure InitGraph( var gd:integer; var gm:integer;


cd:string);

în care gd şi gm reprezintă codul corespunzător driverului şi modului


grafic iar cd reprezintă calea spre fişierele de grafică.
Vei iniţializa Variabila gd cu constanta predefinită
const detect=0
pentru a se omite apelarea procedurii DetectGraph înaintea apelării
procedurii InitGraph.

84
Grafică în Turbo Pascal

2.Procedura DetectGraph cu antetul:


Procedure DetectGraph(var gd, gm:integer);
determină valorile pentru variabilele gd şi gm.

3. Funcţiile GetMaxX cu antetul Function GetMaxX:integer;


şi GetMaxY cu antetul Function GetMaxY:integer;
dau valorile maxime pentru X şi, respectiv, Y în modul grafic actual. Pentru
ecranul setat la o imagine standard cu 640x480 pixeli aceste valori sunt
respectiv 639 şi 479.

4. Funcţia GetDriverName, apelată după activarea procedurii InitGraph,


dă numele driverului grafic actual. Antetul ei este:
Function GetDriverName:string;

5. Funcţia GetGraphMode dă codul modului grafic actual. Antetul ei este:


Function GetGraphMode:integer;
Valoarea ei variază între 0 şi 5 în funcţie de driverul grafic actual.

6. Procedura GetAspectRatio dă rezoluţia ecranului grafic din care se


poate calcula raportul Xasp/Yasp ce dă alungirea formelor circulare;
raportul Xasp/Yasp e necesar la unele ’rotunjiri’ în trasarea cercurilor,
sectoarelor de cerc, arcelor. Procedurile folosite pentru aceasta sunt:
GetAspectRatio(var Xasp, Yasp:word);
SetAspectRatio(Xasp, Yasp:word);

7. Revenirea la ecranul alfanumeric se face cu procedura CloseGraph

6.3.2. Tratamentul erorilor grafice

Erorile în modul grafic sunt returnate de funcţia GraphResult sub forma


unui cod de eroare. Dacă codul returnat este zero înseamnă că
operaţia grafică a reuşit; dacă codul este mai mic decât zero înseamnă că
operaţia grafică a eşuat. Antetul funcţiei este:

function GraphResult:integer;
Câteva valori predefinite ale funcţiei sunt:
Const
grOK=0; {operaţie grafică reuşită, nici o eroare}
grNoInitGraph=-1; { grafica BGI neinstalată cu
InitGraph}
grNotDetected=-2; {grafica hardware nedetectată}
grFileNotFound=-3; {fişierul driver *.BGI nu a fost
găsit}
De notat că GraphResult e pus la zero după ce este apelat aşa că
rezultatul trebuie stocat într-o variabilă temporară pentru a fi testat.

6.3.3. Definirea ferestrelor în grafica TP

Prin fereastră vei înţelege o zonă dreptunghiulară a ecranului (în particular


tot ecranul). Fereastra sau ferestrele sunt folosite pentru
gruparea informaţiilor grafice.

85
Grafică în Turbo Pascal

De regulă fiecare fereastra va fi ocupată cu o anumită categorie de


informaţii – grafice sau literale. Pentru a defini şi lucra cu ferestre în
grafica TP se folosesc procedurile:
• procedure SetViewPort(x1,y1,x2,y2:integer;
clip:boolean);
unde:
x1, y1 coordonatele absolute stânga-sus ale ferestrei active
x2, y2 coordonatele absolute dreapta-jos ale ferestrei active
clip determină dacă liniile din afara ferestrei sunt sau nu
vizibile.

Constantele predefinite pentru stabilirea valorii variabilei clip sunt:


const
clipon=true; {tăierea este activă; exteriorul este
invizibil}
clipoff=false; {tăierea este pasivă; exteriorul este
vizibil}

Procedura defineşte fereastra grafică.

• procedure GetViewSettings(var infofer:ViewPortType);


permite obţinerea de informaţii referitoare la fereastra actuală şi felul
tăierii. Variabila infofer este de tipul predefinit ViewPortType şi va conţine
informaţii referitoare la fereastră.

Type ViewPortType = RECORD


x1, y1, x2, y2 : integer;
clip : boolean;
END;

• procedure ClearDevice;
şterge ecranul grafic actual şi poziţionează pointerul în poziţia (0, 0).

• procedure ClearViewPort
şterge fereastra grafică actuală. Culoarea ferestrei va fi culoarea de
fond; este apelată procedura rectangle pentru trasarea unui dreptunghi
corespunzător ferestrei şi pointerul este mutat în colţul stânga - sus al
ferestrei, punctul de coordonate relative (0, 0).

6.3.4. Reprezentarea punctelor în grafica TP

Pentru a desena puncte se foloseşte procedura :


procedure PutPixel(x, y :integer ; cul :word) ;
Execuţia ei îţi va produce un punct, de culoarea dată de variabila cul în
punctul de coordonate x, y.
Variabila cul ia valori între zero şi valoarea dată de funcţia GetMaxColor,
(max=15 pentru o setare a plăcii grafice la adâncime de culoare 16 ).
Antetul funcţiei este :
function GetMaxColor:word;

86
Grafică în Turbo Pascal

6.3.5. Reprezentarea liniilor- culori, stiluri şi grosimi; deplasarea în


fereastra grafică

Pentru a desena linii se folosesc procedurile:


• Line(x1,y1,x2,y2:integer):
care desenează o linie între punctele de coordonate (x1,y1) şi (x2,y2).

Atenţie: după trasarea liniei pointerul nu rămâne în punctul de coordonate


(x2,y2) ci revine la poziţia (0,0). Nu poţi conta pe poziţionarea pointerului
în ultimul punct desenat – aşa cum se întâmplă la executarea altor
programe de grafică.

• Culoarea în care este desenată linia poate fi stabilită cu procedura:


SetColor(color:word);
Implicit, adâncimea de culoare este 16. Culorile de desen merg de la 0 la
15. În general adâncimea de culoare este dependentă de driverul grafic
curent şi de modul grafic curent. Culorile sunt definite pentru adâncimea
de 16 culori conform informaţiilor de mai jos prin fixarea valorii pentru
CONST

black=0; blue=1; green=2;


cyan=3; red=4; magenta=5;
brown=6; lightgray=7; darkgray=8;
lightblue=9; lightgreen=10; lightcyan=11;
lightred=12; lightmagenta=13; yellow=14;
white=15; blink=128;

• Vei stabili stilul şi grosimea liniei cu procedura:


SetLineStyle(linestyle:word;pattern:word;
thickness:word);

Constantele pentru LineStyle pot stabili că linia este plină, sau punctată
sau linie – punct, sau linie întreruptă , precum şi grosimea liniei. Astfel
CONST poate avea valorile date mai jos pentru fixarea stilului liniei
solidln=0;
dottedln=1;
centerln=2;
dshedln=3;
userbitln=4; {user-define line style}.
Pentru fixarea grosimii liniei ai la dispoziţie valorile :
CONST
normwidth=1;
thickwidth=3;
Variabila pattern este ignorată cât timp linestyle este diferit de 4. Când
linestyle = 4, ceea ce înseamnă că linia este trasată după un model
decis de utilizator, linia este trasată folosind un model 16-bit definit de
parametrul Pattern. De exemplu dacă pattern=$AAAA atunci modelul 16-
bit arată astfel:
1010101010101010 {pentru normwidth}

87
Grafică în Turbo Pascal

1010101010101010
1010101010101010
1010101010101010 {pentru thickwidth}

• LineTo(x, y:integer);
desenează o linie din poziţia curentă a pointerului până la un punct de
coordonate (x, y). Aceleaşi observaţii pentru culoare şi stil ca la procedura
Line.

• LineRel(Dx, Dy:integer);
desenează o linie din poziţia curentă a pointerului până la un punct definit
de distanţele Dx, Dy. Aceleaşi observaţii pentru culoare şi stil ca la
procedura Line.

Poţi deplasa pointerului în punctul de coordonate (x, y) cu comenzile :

– MoveTo(x, y:integer):care mută pointerul din poziţia curentă în


punctul de coordonate (x,y).
Dacă este definită o fereastră, valorile (x, y) sunt relative la fereastră.
Poţi de asemenea muta pointerul în mod relativ, la distanţe date faţă de
poziţia curentă. Comanda
- MoveRel(Dx, Dy:integer);
duce pointerul din poziţia curentă la un punct aflat la distanţele Dx, Dy de
poziţia curentă.

6.3.6. Reprezentarea cercului , a arcului de cerc, a elipsei , a sectorului


de cerc. Umplerea suprafeţelor închise.

Pentru a desena un cerc, un arc de cerc, un arc de elipsă sau un sector


de cerc foloseşti următoarele proceduri.

• procedure Circle(x, y:integer; raza:word);


care îţi desenează un cerc cu centru în punctul de coordonate (x, y) şi cu
raza dată.

• procedure Arc(x, y:integer; ustart, ufinal, r:word);


îţi desenează un arc de cerc cu centrul în punctul de coordonate (x, y) şi
raza dată. Arcul începe de la unghiul ustart şi se sfârşeşte la unghiul
ufinal, ambele unghiuri date în grade şi mergând în sens trigonometric.

• procedure Ellipse
(x,y:integer;ustart,ufinal:word;xraza,yraza:word);
îţi desenează un arc de elipsă pentru care (x, y) sunt coordonatele
centrului, ustart, ufinal sunt unghiurile de început şi sfârşit luate în sens
trigonometric, iar xraza, yraza sunt axele orizontală şi, respectiv, verticală
ale elipsei.

• procedure PieSlice(x, y:integer; ustart,


ufinal,r:word); desenează şi haşurează un sector de cerc. Modelul şi
culoarea de haşurat sunt definite cu:

88
Grafică în Turbo Pascal

• procedure SetFillStyle(pattern:word; color:word);


Modelul implicit este compact (solid) şi culoarea implicită este culoarea cu
cod maxim din paletă. Constantele a căror valoare determină stilul
haşurării sunt:

CONST
emptyfill=0; {umple in culoarea de fond}
solidfill=1; {umple cu culoare\}
linefill=2; {umple aria cu modelul- - -}
ltslashfill=3; {umple aria cu modelul /// }
slashfill=4; {umple aria cu modelul ///
mai groase }
bkslashfill=5; {umple aria cu modelul \\\ }
ltbkslashfill=6; {umple aria cu modelul \\\
dar mai subtiri}
hatchfill=7; {umple aria cu modelul ||| }
xhatchfill=8; {umple aria cu modelul xxx }
... ...
userfil=12; {modelul e dat de programator}

• procedure SetFillPattern
(pattern:FillPatternType;color:word);
umple figura grafică cu un model definit de programator în culoarea
definită de parametrul color.

Type FillPatternType=array[1..8] of byte;

Motivul de umplere ( elementul grafic folosit pentru realizarea umplerii) se


bazează pe valoarea celor 8 bytes (octeţi) conţinuţi în vectorul pattern;
fiecare octet corespunde la 8 pixeli de motiv. Dacă un bit are valoarea 1
pixelul are culoarea cernelii, dacă el are valoarea 0 pixelul are culoarea
fondului.

• procedure FillEllipse(x, y:integer; xraza,


yraza:word); desenează şi haşurează o elipsă în culoarea curentă şi
modelul de haşurare definit de procedurile SetFillStyle sau
SetFillPattern.

6.3.7. Reprezentarea liniilor poligonale

Pentru a desena poligoane se folosesc următoarele proceduri.

• rectangle(x1, y1, x2, y2:integer);


care îţi desenează un dreptunghi pentru care:
(x1, y1) sunt coordonatele colţului stânga-sus
(x2, y2) sunt coordonatele colţului dreapta-jos

• Bar(x1, y1, x2, y2:integer);


desenează un dreptunghi şi îl haşurează în culoarea şi modelul stabilite cu
procedurile SetFillStyle sau SetFillPattern. (x1, y1) şi (x2, y2)
au aceeaşi semnificaţie ca în procedura rectangle.

89
Grafică în Turbo Pascal

• Bar3d(x1, y1, x2, y2:integer; ad:word; top:boolean);


desenează un paralelipiped dreptunghi în relief şi îl haşurează în culoarea
şi modelul curente.(x1, y1) şi (x2, y2) au aceeaşi semnificaţie ca în
procedurile rectangle şi bar; ad este adâncimea corpului.

top = TRUE înseamnă că deasupra paralelipipedului se poate aşeza un


alt paralelipiped
top = FALSE înseamnă că deasupra paralelipipedului nu se poate aşeza
alt paralelipiped. Există valori predefinite ale constantei de fixare a
reliefului şi anume :
topon = TRUE;
topoff=FALSE;

• DrawPoly(nrpct:word; var puncte);


desenează o linie poligonală în culoarea şi stilul curente.
nrpct reprezintă numărul vârfurilor liniei poligonale
puncte este un parametru variabilă fără tip care conţine coordonatele
fiecărui vârf în linia poligonală. De notat că pentru a desena o figură
închisă cu n vârfuri trebuie să se transmită n+1 coordonate ; punctul de
început al liniei trebuie să coincidă cu cel final.
puncte[n+1]=puncte[1]

• procedure FillPoly(nrpct:word; var puncte);


desenează şi haşurează un poligon în culoarea şi modelul curente.

6.3.8. Scrierea grafică

Pentru scrierea textelor în modul grafic sunt incluse fonturi (tipuri de


caractere) 8*8 bit-mapped şi fonturi vectoriale.
Un caracter 8*8 bit-mapped este definit de o matrice 8*8 pixeli.
Un font ’vectorial’ este definit de o serie de vectori care spun sistemului
grafic cum să deseneze caracterul.
Scrierea şi selecţia caracterelor se face cu următoarele proceduri:

• SetTextStyle(font:word; direction:word;
charsize:word);
În funcţie de valorile pe care le vei atribui constantelor pentru caracter,
direcţie şi dimensiune vei obţine rezultatele descrise în cele ce urmează.

CONST

DefaultFont=0; {8*8 bit-mapped font}


TriplexFont=1; {font vectorial}
SmallFont=2; {font vectorial}
SansSerifFont=3; {font vectorial}
GothicFont=4; {font vectorial}

HorizDir=0; VertDir=1;

90
Grafică în Turbo Pascal

• SetUserCharSize(multX, divX, multY, divY:word)


permite programatorului să varieze lărgimea şi înălţimea caracterului în
cazul folosirii fonturilor vectoriale.
multX : divX este raportul cu care trebuie înmulţită lăţimea normală
pentru fontul activ
multY : divY este raportul cu care trebuie înmulţită
înălţimea normală pentru fontul activ
De exemplu, pentru a face fontul de 2 ori mai lat se foloseşte 2 pentru
multX şi 1 pentru divX.

Apelul acestei proceduri pune mărimea caracterului curent la valoarea


dată.

• Textul grafic se realizează apelând una din procedurile următoare:


– OutText(text:string); unde text este textul trimis la ieşire la
poziţia curentă a pointerului folosind fontul curent pus cu SetTextStyle.

– OutTextXY(x, y:integer; text:string);


textul este scris începând din punctul de coordonate (în pixeli) (x, y).
Fără apelarea procedurii SetTextStyle scrierea se face cu fontul
DefaulFont.

Ca să te familiarizezi cu utilizarea informaţiilor despre grafică pe care le-ai


studiat până aici, îţi propunem să exersezi utilizarea funcţiilor şi
procedurilor grafice cu un program care îşi propune ca pe ecranul
monitorului să se deseneze patru ferestre, fiecare ocupând un sfert de
ecran. În prima fereastră trebuie să se scrie coordonatele colţurilor stânga-
sus şi dreapta-jos şi valoarea variabilei clip; În ea trebuie să scrii şi că este
prima fereastră. În a doua fereastră îţi propunem să desenezi linii paralele
în diverse stiluri, grosimi şi culori. În a treia fereastră vei desena un cerc, o
elipsă şi un sector de cerc - ultimele haşurate în diferite stiluri şi culori. În a
patra fereastră vei desena un triunghi gol şi un triunghi haşurat. Vei aranja
culoarea fondului în alb şi vei folosi culoarea albastra a cernelii cu care
scrii şi desenezi. Încearcă să scrii singur programul. Compară rezultatul
obţinut de tine cu cel pe care îl obţii executând programul listat mai jos.
Urmăreşte cu atenţie alegerile pentru valorile constantelor care determină
acţiunile procedurilor grafice.

EX25.PAS

program ex_viewport;
uses graph;
var gd,gm,centrux,centruy,i:integer;
xmax, ymax, maxcolor:integer;
inf:viewporttype;
cx1,cy1,cx2,cy2:string[5];
const cstil:array[1..3]of string=
(’dotted’,’centerln’,’dashedln’);
triunghi:array[1..4] of pointtype=
((x:10;y:50),(x:150;y:50),

91
Grafică în Turbo Pascal

(x:150;y:100),(x:10;y:50));
triunghi1:array[1..4] of pointtype=
((x:170;y:100),(x:270;y:100),
(x:270;y:200),(x:170;y:100));
begin
gd:=detect; initgraph(gd,gm,’\tp\bgi’);
centrux:=getmaxx div 2;
centruy:=getmaxy div 2;
setbkcolor(15); setcolor(1);
rectangle(10,10,centrux-10,centruy-10); {prima
fereastra}

setviewport(10,10,centrux-10,centruy-10,clipon);
getviewsettings(inf);
str(inf.x1,cx1); str(inf.y1,cy1);
str(inf.x2,cx2); str(inf.y2,cy2);

outtextxy(10,30,cx1);outtextxy(70,30,cy1);
outtextxy(10,50,cx2);outtextxy(70,50,cy2);
outtextxy(10,70,’clipon’);
outtextxy(10,100,’prima fereastra’);
xmax:=centrux-20;
ymax:=centruy-20;
maxcolor:=getmaxcolor;
randomize;
for i:=1 to 200 do
putpixel(random(xmax)+1,random(ymax)+1,randommaxcolor
)+1);
readln;
{revenirea la ecran}
setviewport(0,0,getmaxx,getmaxy,clipon);
rectangle(centrux+10,10,getmaxx-10,centruy-10);
{a doua fereastra}
setviewport(centrux+10,10,getmaxx-10,centruy-
10,clipon);
line(10,10,50,10);
outtextxy(60,10,’standard’);
setlinestyle(dottedln,0,normwidth);
line(10,50,50,50);outtextxy(60,50,’dottedline,
normwidth’); setlinestyle(dottedln,0,thickwidth);
line(10,90,50,90);outtextxy(60,90,’dottedline,
thickwidth’); setlinestyle(userbitln,$c3,thickwidth);
line(10,130,50,130);
outtextxy(60,130,’ userbitln, thickwidth’);
for i:=1 to 3 do
begin
setcolor(i+2);
setlinestyle(i,0,normwidth);line(10,130+20*i,60,20*i+13
0); outtextxy(140,20*i+130,cstil[i]);
setlinestyle(i,0,thickwidth);line80,20*i+130,130,20*i+1
30);

92
Grafică în Turbo Pascal

end;
readln;
setlinestyle(0,0,1);setcolor(1);
{revenirea la ecran}
setviewport(0,0,getmaxx,getmaxy,clipon);
{a reia fereastra}
rectangle(10,centruy+10,centrux-10,getmaxy-10);
setviewport(10,centruy+10,centrux-10,getmaxy-
10,clipon);
circle(60,60,50); setfillstyle(7,3);
fillellipse(160,120,60,40);
setfillstyle(4,5); pieslice(250,170,0,270,40); readln;
setcolor(1); {revenirea la ecran}
setviewport(0,0,getmaxx,getmaxy,clipon); { a patra
fereastra} rectangle(centrux+10,centruy+10,getmaxx-
10,getmaxy-10);
setviewport(centrux+10,centruy+10,getmaxx-10,getmaxy-
10,clipon); setfillstyle(2,4);
drawpoly(sizeof(triunghi) div sizeof(pointtype),
triunghi);
fillpoly(sizeof(triunghi) div sizeof(pointtype),
triunghi1);
readln;
closegraph; end.

Notă: funcţia Sizeof(x) dă numărul de octeţi ocupat de argument; x


poate fi o referire de variabilă sau un identificator de tip.
Rezultatul executării programului este producerea pe ecranul monitorului a
unei imagini identice cu aceea prezentată în figura 6.2.

Figura 6.2

93
Grafică în Turbo Pascal

Utilizarea graficii în TP este o facilitate agreabilă pentru aplicaţiile


matematice şi pentru reprezentarea rezultatelor studiilor de fizică.
Următorul program reprezintă grafic funcţia:

f (x) = x 4 - 9x 3 - 2x 2 + 120x - 130


Într-un sistem de coordonate reprezentat de asemenea. Rezultatul grafic
produs de program este dat în figura 6.3.

EX26.PAS

program repr_fct;
uses graph;
const n=48; dx=0.25;
type vector=array[1..n]of real;
var i:byte;
xarg, yfv:vector;
xp, yp:array[1..n] of integer;
xpmax, ypmax, xpmin, ypmin, xscal, yscal, xf:real;
xreper:array[1..3] of integer;

function xlap(p:byte; x:real):real;


var i:byte; xp:real;
begin
xp := 1;
for i :=1 to p do xp := xp * x;
xlap := xp;
end;
fnction f(x:real):real;
begin
f := xlap(4, x)-9*xlap(3, x)-2*xlap(2, x)+120*x-
130.;
end;
procedure gr_fct;
var i:byte; gd, gm :integer;
begin
gd := detect; Initgraph(gd, gm, ’\tp\bgi’);
setbkcolor(15); setcolor(1);
setviewport(0, 0, 630, 470,clipon);
setlinestyle(1, 1, 1); line(0, 225, 600, 225);
line(300, 0, 300, 440);
line(xreper[1],220,xreper[1],230);
outtextxy(xreper[1]-10,240,’-4’);
line(xreper[2],220,xreper[2],230);
outtextxy(xreper[2]-10,240,’4.’);
line(xreper[3],220,xreper[3],230);
outtextxy(xreper[3]-10,240,’8.’);
outtextxy(60,50,’x^4-9x^3-2x^2+120x-130’);)
for i := 1 to n do circle(xp[i],yp[i],2); r
readln;
closegraph;
end;

94
Grafică în Turbo Pascal

BEGIN
xpmax:=-1E30; xpmin:=1E30; ypmax:=-1E30; ypmin:=1E30;
for i := 1 to n do
begin
xarg[i] := -4. + i*dx; xf:=xarg[i]; yfv[i]:=f(xf);
if xpmax < xarg[i] then xpmax := xarg[i];
if xpmin > xarg[i] then xpmin := xarg[i];
if ypmax < yfv[i] then ypmax := yfv[i];
if ypmin > yfv[i] then ypmin :=yfv[i];
end;
writeln(’xpmax=’, xpmax:10:2, ’ ypmax=’, ypmax:10:2);
writeln(’xpmin=’,xpmin:10:2, ’ ypmin=’, ypmin:10:2);
readln;
xscal := 400/(xpmax-xpmin); yscal := 300/(ypmax-ypmin);
writeln(’xscal=’,xscal:10:2, ’ yscal=’,yscal:10:2);
xreper[1] := 300 -trunc(4*xscal);
xreper[2] := 300 + trunc(4*xscal);
xreper[3] := 300 + trunc(8*xscal); readln;
for i := 1 to n do
begin
xp[i] := 300 + trunc(xarg[i]*xscal);
yp[i] := 225 - trunc(yfv[i]*yscal);
end;
gr_fct; {apelarea procedurii de grafica}
END.

Figura 6.3

95
Grafică în Turbo Pascal

6.4. Test de autoevaluare 1

1. cu ce procedură se intră în modul grafic?

2. care sunt dimensiunile în pixeli ale ecranului grafic?

3. cu ce procedură se reprezintă punctele pe ecranul grafic?

4. cu ce proceduri se reprezintă liniile în ecranul grafic?

5. cu ce proceduri se stabileşte culoarea cernelii şi a fondului?

6. cu ce proceduri se desenează cercuri, dreptunghiuri; dar figuri


închise haşurate?

7. ce trebuie făcut când avem de reprezentat o funcţie ale cărei valori


ies din domeniul de pixeli pe x şi pe y?

8. cu ce procedură se iese din modul grafic?

Răspunsurile le găseşti la pagina 97

96
Grafică în Turbo Pascal

6.5. Răspunsuri la testul de autoevaluare 1

1.După antetul programului trebuie scrisă directiva Uses Graph.


Iniţializarea modului grafic se face cu
procedure grstart;
begin
gd:=detect; InitGraph(gd, gm, ’\TP\BGI’);
If graphresult <>grok then halt(1);end;
Trebuie să te asiguri că ai plasat antetul procedurii InitGraph:
Procedure InitGraph( var gd:integer; var
gm:integer; cd:string);
2. 640X480
3. procedure PutPixel(x, y :integer ; cul :word) ;
4. Line(x1,y1,x2,y2:integer):
Culoarea în care este desenată linia este stabilită cu procedura:
SetColor(color:word) ;
Stilul şi grosimea liniei sunt stabilite cu procedura:
SetLineStyle(linestyle:word;pattern:word;
thickness:word);
5. setbkcolor(număr)- pentru fond; setcolor(număr)-
pentru cerneală;
6. procedure Circle(x, y:integer; raza:word);
• procedure SetFillPattern
(pattern:FillPatternType;color:word);
umple figura grafică cu un model definit de programator în culoarea
definită de parametrul color.
Type FillPatternType=array[1..8] of byte;
• rectangle(x1, y1, x2, y2:integer);
• procedure FillPoly(nrpct:word; var puncte);
desenează şi haşurează un poligon în culoarea şi modelul curente.
600 400
7. Imaginea trebuie rescalată cu xscal = ; yscal = ;
x max y max
valorile maxime trebuie fixate în program
8. Revenirea la ecranul alfanumeric se face cu procedura
CloseGraph

97
Grafică în Turbo Pascal

6.6. Termeni şi expresii cheie

Termeni şi expresii cheie


 Unit GRAPH
 Proceduri grafice;
 Adâncime de culoare;umplere, pattern
 Pixel:; utilizarea punctului, a liniei; a cercului şi
liniei poligonale.
 Fixarea caracteristicilor grafice;
 Scriere în mod grafic.

6.7. Lucrare de verificare

Rezolvă problemele de mai jos. Trimite tutorelui răspunsurile pe care le


consideri corecte

Dacă eşti sigur că ai înţeles bine cum se iniţializează modul grafic şi


cum se folosesc procedurile grafice atunci construieşte programe
care să execute sarcinile de mai jos.
Folosind un editor de texte scrie listingul programului pe care l-ai
propus. Inserează în text imaginea rezultată după execuţia
programului. Trimite lucrarea pentru apreciere.

1. desenează 2 ferestre pe ecranul grafic. În prima desenează un


cerc plin uniform cu culoarea fondului şi unul haşurat cu desenul
haşurării în culoarea verde; în a doua fereastră desenează un pătrat
(3 pct)
2. desenează o căsuţă cu uşă, ferestre, gard şi câţiva pomi
(3 pct)
3. desenează o floare din sectoare de cerc şi scrie câteva rânduri cu
diferite fonturi; o felicitare să zicem.
(3 pct)

Notă: se acordă un punct din oficiu Total 10 puncte

6.8. Bibliografie

1. Anişoara Constantinescu, Simona Şerban, Victor Ionuţ Stoica, Limbajul


de programare Turbo Pascal Editura Anima, paginile 89-112.

98
Algoritmi Complecşi

Unitatea de învăţare 7
ALGORITMI COMPLECŞI

Cuprins Pagina
ALGORITMI COMPLECŞI97 99
7.1. Obiectivele Unităţii de învăţare 7 - Algoritmi complecşi 100
7.2. Sisteme de numeraţie 100
7.2.1. Conversia zecimal - binară 101
7.2.2. Conversia binar-zecimală 103
7.2.3. Conversia octal-binară 104
7.2.4. Conversia binar-octală 104
7.2.5. Conversia binar-hexazecimală şi invers 104
7.3. Test de autoevaluare 1 105
7.4. Rezolvarea ecuaţiilor algebrice 106
7.4.1. Metoda înjumătăţirii intervalului 107
7.4.2. Metoda Newton-Raphson 108
7.4.3. Metoda Birge-Vieta 109
7.5. Rezolvarea sistemelor de ecuaţii algebrice liniare 111
7.5.1. Metoda Gauss-Seidel 112
7.5.2. Metoda Gauss-Jordan 114
7.6. Integrarea numerică 115
7.6.1. Metoda trapezelor 116
7.6.2. Metoda Simpson 116
7.7. Integrarea numerică a ecuaţiilor diferenţiale de ordin 1 118
7.7.1. Metoda Runge-Kutta de ordin 4 119
7.8. Metoda Monte Carlo 121
7.8.1. Numere aleatoare 124
7.8.2. Principiul fundamental al metodei Monte Carlo 124
7.9. Test de autoevaluare 2 129
7.10. Răspunsuri la testele de autoevaluare 129
7.11. Termeni şi expresii cheie. Formule cheie 130
7.12. Lucrare de verificare 131
7.13. Bibliografie 132

99
Algoritmi Complecşi

7.1. Obiectivele Unităţii de învăţare 7 - Algoritmi complecşi

Când vei termina de studiat acest capitol vei fi capabil:

să construieşti algoritmi pentru rescrierea numerelor în


diverse sisteme de numeraţie.

să identifici tipul algoritmului utilizabil pentru rezolvarea


ecuaţiilor algebrice şi a sistemelor de ecuaţii lineare;

să construieşti algoritmi de rezolvare numerică pentru


ecuaţiilor diferenţiale.

să aplici cunoştinţele dobândite în utilizarea metodei Monte


Carlo pentru a construi algoritmi cu care să rezolvi
probleme de fizică.

7.2. Sisteme de numeraţie


Ne este tuturor cunoscut că numerele sunt reprezentate în memoria
calculatorului în sistemul binar în timp ce noi lucrăm cu numere în sistemul
zecimal. Pentru a vedea cât de necesar este să indicăm bine tipul datelor
cu care lucrăm într-un program, din punct de vedere al domeniului valorilor
definite (pentru numere întregi) sau din punct de vedere al preciziei
reprezentării lor (pentru numere reale) să spunem câteva cuvinte despre
sistemele de numeraţie şi trecerea dintr-un sistem de numeraţie în altul.
Când un număr N se scrie într-o formă care conţine cifre succesive, adică
în scriere poziţională,
N = d n −1d n − 2  d1d0 d −1d − 2 1 − m d − m ( 7.1)
se subînţelege că valoarea avută în vedere este
N = d n −1 ⋅ r n −1 + d n − 2 ⋅ r n − 2 +  + d1 ⋅ r 1 + d0 ⋅ r 0 + d −1 ⋅ r −1 +  + d − m ⋅ r − m ( 7.2)
în expresiile de mai sus :
d reprezintă o cifră,
r este baza sau rădăcina,
n este numărul de cifre întregi şi
m este numărul de cifre fracţionare ale numărului.
De exemplu numărul zecimal 123,45 (în reprezentare poziţională)
înseamnă de fapt
123 ,45 = 1 ⋅10 2 + 2 ⋅101 + 3 ⋅10 0 + 4 ⋅10 −1 + 5 ⋅10 −2 ( 7.3)

100
Algoritmi Complecşi

În alte baze de numeraţie numerele au alte înţelesuri. De exemplu ,


numărul binar 101,01 are cu totul altă semnificaţie decât acelaşi număr
scris în baza 10 şi anume
101,01 = 1 ⋅ 2 2 + 0 ⋅ 21 + 1 ⋅ 2 0 + 0 ⋅ 2 −1 + 1 ⋅ 2 −2 ( 7.4)

Astfel, într-un sistem de numeraţie, cifra este un simbol care reprezintă o


cantitate anumită.Numărul de simboluri permise pentru reprezentarea
cifrei într-un sistem de numeraţie este numit baza sau rădăcina sistemului
de numeraţie.
Pentru numerele zecimale poţi folosi cifrele de la 0 la 9 în total 10
simboluri. Baza sistemului de numeraţie este 10. Pentru numerele binare
poţi folosi două simboluri – cifrele 0 şi 1. Baza sistemului de numeraţie
este doi.
În reprezentarea poziţională cifra d n −1 este cifra cea mai reprezentativă a
numărului iar cifra d − m este cifra cea mai puţin reprezentativă.
Cifra binară se numeşte bit şi sunt definiţi multiplii acestei unităţi: byte (sau
octet pentru 8 biţi), kilobyte, megabyte, gigabyte.
Principalele sisteme de numeraţie întâlnite de programatori sunt
prezentate în tabelul din figura 7.1.

Baza Numele
sistemul de sistemului
numeraţie
2 binar
8 octal
10 zecimal
16 hexazecimal
Figura 7.1

În continuare vei întâlni punctul ca separator între partea întreagă şi


partea fracţionară ale unui număr.

7.2.1. Conversia zecimal - binară

7.2.1.1. Metoda împărţirii repetate pentru conversia numerelor întregi


Conversia zecimal - binară a unui număr întreg N înseamnă găsirea
cifrelor binare ale lui N, adică scrierea numărului ca o sumă de puteri ale
lui 2 în forma
N = b n−1 2n−1 + ... + b 1 21 + b 0 20 ( 7.5)
Problema constă în găsirea cifrelor b i . Algoritmul operaţiei este următorul:
• împarte numărul întreg N cu 2; vei obţine un număr întreg, Q 1 , şi restul
b 0 ; Q 1 are expresia
Q 1 = b n−1 2n−2 + ... + b 1 20 ( 7.6)
• împarte Q 1 la 2; vei obţine un număr întreg, Q 2 şi restul b 1 .
• Continuă acest procedeu până când obţii câtul zero şi rest cifra cea mai
semnificativă, b n−1

101
Algoritmi Complecşi

Urmăreşte în tabelul din figura 7.2. aplicarea algoritmului de mai sus


pentru reprezentarea binară a numărului întreg N10 =53 (indicele 10
înseamnă că numărul este scris în baza 10)

Qi bi
53:2 cât 26 + rest 1
26:2 cât 13 + rest 0
13:2 cât 6 + rest 1
6:2 cât 3 + rest 0
3:2 cât 1 + rest 1
1:2 cât 0 + rest 1
Figura 7.2.

Aşadar, reprezentarea binară (în baza 2) a lui N 10 este N 2 = 110101

7.2.1.2. Metoda înmulţirii repetate pentru conversia numerelor


fracţionare
Pentru conversia zecimal - binară a unui număr zecimal (subunitar) se
foloseşte metoda înmulţirilor repetate. Dacă N este numărul zecimal
fracţionar (subunitar) care urmează a fi transformat în număr binar poţi
găsi cifrele reprezentării sale binare astfel
N = b−1 ⋅ 2 −1 + b−2 ⋅ 2 −2 +  + b−m ⋅ 2 − m ( 7.7)
Algoritmul este următorul:
• înmulţim cu 2 expresia de mai sus; obţinem b −1 ca întreg şi un număr
fracţionar, F 1 care are expresia:
F1 = b−2 ⋅ 2 −1 +  + b−m ⋅ 2 − m +1 ( 7.8)
• înmulţim F 1 cu 2 şi obţinem cifra b −2 ca întreg şi un număr fracţionar
F2
• se poate continua până se obţine un număr fracţionar zero dar nu
întotdeauna acest lucru este posibil. Un număr fracţionar finit într-un
sistem de numeraţie nu poate fi întotdeauna reprezentat tot de un număr
finit într-un alt sistem de numeraţie; de aici rezultă precizia limitată a
reprezentării numerelor reale în memoria calculatorului.

Ca exemplu îţi propunem să urmăreşti procedura de trecere le


reprezentarea binară a numărului zecimal N 10 = 0.3 prezentată în figura
7.3. Conform algoritmului de înmulţire repetată:

Fi b -i
0.3 * 2 = 0.6 → 0.6 0
0.6 * 2 = 1.2 → 0.2 1
0.2 * 2 = 0.4 → 0.4 0
0.4 * 2 = 0.8 → 0.8 0
0.8 * 2 = 1.6 → 0.6 1
0.6 * 2 = 1.2 → 0.2 1
... ...... 
Figura 7.3

102
Algoritmi Complecşi

Aşa dar reprezentarea binară lui 0.3 este 0.010011 Dacă se iau doar
primele 4 cifre (după punctul zecimal) ale reprezentării binare, numărul din
memorie este 0.25! Dacă se consideră 6 cifre binare (după punctul
zecimal) atunci reprezentarea lui 0.3 în memoria calculatorului este
0.296875, mai bună dar nu exactă. Cum unui număr real i se alocă în TP
6 octeţi adică 6*8=48 cifre binare, este clar că există o precizie limitată de
reprezentare a numerelor reale în memoria calculatorului.

7.2.2. Conversia binar-zecimală

7.2.2.1. Metoda înmulţirii repetate pentru conversia numerelor întregi


Pentru conversia binar - zecimală a unui număr întreg se foloseşte metoda
înmulţirii repetate cu 2. Presupune că numărul N este un număr binar
întreg cu 6 cifre; îl poţi deci scrie astfel:
N = b5 ⋅ 2 5 + b4 ⋅ 2 4 + b3 ⋅ 2 3 + b2 ⋅ 2 2 + b1 ⋅ 21 + b0 ⋅ 2 0 ( 7.9)
sau, pentru a evita folosirea puterilor lui 2,
N = ((((b5 ⋅ 2 + b4 ) ⋅ 2 + b3 ) ⋅ 2 + b2 ) ⋅ 2 + b1 ) ⋅ 2 + b0 ( 7.10)
Ca exemplu de utilizare a algoritmului îţi propunem să urmăreşti exemplul
de mai jos în care se găseşte reprezentarea zecimală a numărului binar
N=110101. Numărul poate fi scris fie ca
N = 1 ⋅ 2 5 + 1 ⋅ 2 4 + 0 ⋅ 2 3 + 1 ⋅ 2 2 + 0 ⋅ 21 + 1 ⋅ 2 0 = 53 ( 7.11)
fie ca
N = ((((1 ⋅ 2 + 1) ⋅ 2 + 0 ) ⋅ 2 + 1) ⋅ 2 + 0 ) ⋅ 2 + 1 = 53 ( 7.12)
Se vede că numărul întreg maxim pentru un număr n dat de cifre binare
este 2 n − 1 ; 7 pentru 3 biţi, ( numărul binar111), 255 pentru un byte=8biţi,
(numărul binar11111111). Îţi devine mai clară în acest moment
importanţa tipului întreg ales pentru valorile întregi cu care lucrezi în TP.

7.2.2.2. Împărţiri repetate pentru conversia numerelor fracţionare

Dacă N este un număr binar fracţionar pe care vrei să-l converteşti în


număr zecimal fracţionar, poţi să foloseşti metoda împărţirilor repetate.
Dacă N este – de exemplu - un număr binar zecimal cu 4 cifre, el poate fi
scris în forma:
N = b−1 ⋅ 2 −1 + b−2 ⋅ 2 −2 + b−3 ⋅ 2 −3 + b−4 ⋅ 2 −4 ( 7.13)
sau în forma :
( ( ( )))
N = 2 −1 ⋅ b−1 + 2 −1 ⋅ b−2 + 2 −1 ⋅ b−3 + 2 −1 ⋅ b−4 ( 7.14)
Încearcă să găseşti – folosind algoritmul propus - reprezentarea zecimală
a numărului binar N=0.01001. Dacă foloseşti prima formă vei obţine:
N = 0 ⋅ 2 −1 + 1 ⋅ 2 −2 + 0 ⋅ 2 −3 + 0 ⋅ 2 −4 + 1 ⋅ 2 −5 = 0.28125 ( 7.15)
valoare pe care o obţii utilizând şi forma a doua. Într-adevăr a doua
formulă dă
( ( ( )))
N = 2 −1 ⋅ 0 + 2 −1 ⋅ 1 + 2 −1 ⋅ 0 + 2 −1 ⋅ ( 0 + 2 −1 ⋅1 ) = 0.28125 ( 7.16)

103
Algoritmi Complecşi

7.2.3. Conversia octal-binară

Dat fiind că 8 = 23, conversia dintr-o bază în alta se face simplu. Cea mai
mare cifră octală, 7, se scrie ca o combinaţie de 3 biţi, adică sub forma
numărului binar 111 Pentru conversia unui număr din octal în binar se
înlocuieşte fiecare cifră octală cu o combinaţie de 3 cifre binare conform
tabelului din figura 7.4.:

cifră Reprezentare
octală binară
0 000
1 001
2 010
3 011
4 100
5 101
6 110
7 111
Figura 7.4
Exemplu: dacă scrii reprezentarea binară a numărului octal N 8 =346.25
conform cu regula stabilită mai sus, obţii evident
N 8 = 346.25 = 011100110.010101 = 11100110.010101 ( 7.17)

7.2.4. Conversia binar-octală


Conform tabelului de mai sus vei forma combinaţii de 3 biţi pornind de la
punctul zecimal spre stânga pentru partea întreagă şi tot de la punctul
zecimal spre dreapta pentru partea fracţionară şi scrii cifra octală ce
corespunde fiecărei combinaţii de 3 biţi.
Dacă la prima cifră a părţii întregi sau la ultima cifră a părţii fracţionare nu
avem 3 biţi vei adăuga zerouri în faţa primei cifre sau după ultima cifră
pentru a forma combinaţii de 3 biţi. Operaţia este permisă deoarece zero
în faţa unui număr întreg sau la sfârşitul unui număr fracţionar nu schimbă
numărul
Exemplu: să ne propunem să scriem reprezentarea octală a numărului
binar
N 2 = 11100110.01010
Aplicând algoritmul enunţat, pornind de la punctul zecimal formăm spre
stânga combinaţii de 3 biţi: prima cifră în stânga punctului zecimal este
6=110, următoarea este 4=100, pentru următoarea avem doar 2 biţi: 11;
punem în faţa lor 0 şi recunoaştem numărul octal 3=011. Partea întreagă a
numărului octal este deci 346 . Pornind de la punctul zecimal spre dreapta
ai cifrele 2=010 şi, adăugând un zero la sfârşit, 4=100 . Numărul octal este
prin urmare 346.24

7.2.5. Conversia binar-hexazecimală şi invers


La fel de uşor se face trecerea de la numerele scrise în baza 2 la numere
scrise în baza 16 şi invers. Cea mai mare cifră în baza 16 este F(=15
zecimal) care se poate scrie ca o combinaţie de 4 biţi, 1111 Fiecare cifră

104
Algoritmi Complecşi

hexazecimală se va scrie deci ca o combinaţie de 4 biţi conform tabelului


din figura 7.5.

Cifra Cifra Cifra Cifra


Zecimală Binară Octală Hexazecimală
0 0000 0 0
1 0001 1 1
2 0010 2 2
3 0011 3 3
4 0100 4 4
5 0101 5 5
6 0110 6 6
7 0111 7 7
8 1000 10 8
9 1001 11 9
10 1010 12 A
11 1011 13 B
12 1100 14 C
13 1101 15 D
14 1110 16 E
15 1111 17 F
16 10000 20 10
Figura 7.5

Exemple:
1. reprezentarea binară a numărului hexazecimal 1AB1.AB este
0001101010110001.10101011
sau renunţând la zerourile din faţă,
1101010110001.10101011

2. reprezentarea hexazecimală a numărului binar 11100.11001 este


1C.C8
Regula de scriere este aceea deja enunţată anterior adică vei începe
scrierea corespondentă plecând de la punctul zecimal spre stânga sau
dreapta şi dacă nu sunt destule cifre binare adaugi zerouri.

7.3. Test de autoevaluare 1

1. Câte sisteme de numeraţie au fost descrise în această secţiune?

2. Care este algoritmul de trecere a unui număr întreg din baza 10 în


baza 2?

105
Algoritmi Complecşi

3. Care este algoritmul de trecere a unui număr fracţionar (subunitar)


din baza 10 în baza 2?

4.Cum vei proceda ca să treci un număr zecimal cu parte întreagă şi


fracţionară în binar?

5. Trece numărul 12.25 din baza 10 în baza 2

6.Trece numărul binar 110011.10101 într-un număr în baza zece, într-


un număr în baza 8 şi într-un număr în baza 16

Răspunsurile le găseşti la pagina 129.

7.4. Rezolvarea ecuaţiilor algebrice

Fie ecuaţia
F (x ) = 0 ( 7.18)
în care F (x ) este o funcţie polinomială. Vei spune că x 0 este o rădăcină a
ecuaţiei dacă înlocuind x cu x 0 se obţine
F (x 0 ) = 0 ( 7.19)
Ne vom ocupa aici doar de ecuaţiile ce admit rădăcini reale. Pentru
ecuaţiile de gradul unu, doi sau trei există întotdeauna expresii exacte
pentru soluţii analitice. Pentru ecuaţii de grad mai mare ca 3 există mai
multe metode de găsire a unei ”rădăcini aproximative”. Metodele se pot
aplica şi pentru ecuaţiile de grad doi sau trei. Vei înţelege aici prin
rădăcină aproximativă o valoare x apropiată de x 0 în limita unei precizii ε
date.
Este bine ca mai înainte de a căuta rădăcinile unei ecuaţii să o tabelăm pe
un domeniu de valori x în care presupunem că s-ar afla aceste rădăcini şi
cu un pas, dx, care să ducă la cel mult o rădăcină într-un interval x, x+dx.
Iată un astfel de program pentru tabelarea funcţiei:
F ( x ) = x 4 − 9 ⋅ x 3 − 2 ⋅ x 2 + 120 ⋅ x − 130 ( 7.20)

106
Algoritmi Complecşi

EX27.PAS

program Tabel_functie;
var f:text;
x, dx:real;
nume:string[20];
function f(x:real):real;
begin
f:=sqr(x)*sqr(x)-9*sqr(x)*x-2*x*x+120*x-130;
end; {end function}
begin {program principal}
write(’introdu numele fisierului out’);
readln(nume); assign(f,nume);
rewrite(f);
x=-10.; dx:=1.;
while x <= 10 do
begin
writeln(f,x,f(x)); x:=x+dx;
end;
end.
În fişierul al cărui nume l-ai dat de la tastatură se vor afla, după execuţia
programului, valorile x şi valorile corespunzătoare ale lui F(x). Poţi afla
deci intervalele în care funcţia schimbă de semn adică intervalele în care
funcţia trece prin zero. De această informaţie ai nevoie în cele ce
urmează.

7.4.1. Metoda înjumătăţirii intervalului


Dacă [a, b] este un interval în care funcţia schimbă de semn (deci
f ( a ) ⋅ f ( b ) < 0 ) şi deoarece funcţia polinomială este continuă şi are prin
urmare proprietatea Darboux, funcţia polinomială va avea o rădăcină în
intervalul considerat . Pentru funcţia dată mai sus aceste intervale sunt [-4,
-3], [1, 2], [3, 4] şi [7,8]. Întrucât conform teoremei fundamentale a algebrei
ecuaţia are patru rădăcini, sigur în fiecare interval avem o singură
rădăcină. Algoritmul găsirii rădăcinii prin metoda înjumătăţirii intervalului
este următorul:

1. Vei lua o valoare la mijlocul intervalului [a, b], c=(a+b)/2


2. Calculezi f(c)
3. Dacă f(c)=0 înseamnă că c este rădăcina căutată ; dacă f ( a ) ⋅ f ( c ) < 0 (
şi evident f ( c ) ⋅ f ( b ) > 0 ) înseamnă că rădăcina se află în intervalul [a, c]
şi atunci vei relua algoritmul punând b=c . Dacă f ( a ) ⋅ f ( c ) > 0 rădăcina se
află în intervalul [ c , b ] şi vei relua algoritmul punând a = c . Prin metoda
propusă fie ai găsit rădăcina fie ai redus la jumătate intervalul în care
rădăcina se află.
4. Vei verifica dacă intervalul rezultat este mai mic decât precizia cu care
vrei să determini rădăcina; dacă DA scriem valoarea găsită, dacă NU se
reia căutarea soluţiei ca la punctul 1.

107
Algoritmi Complecşi

Programul în TP pentru găsirea celor 4 rădăcini ale ecuaţiei


f ( x ) = x 4 − 9 ⋅ x 3 − 2 ⋅ x 2 + 120 ⋅ x − 130 = 0 ( 7.21)
a fost construit în unitatea de învăţare 5 şi are numele EX19.PAS.

7.4.2. Metoda Newton Raphson

Metoda Newton-Raphson este o metodă iterativă de rezolvare a ecuaţiei


F (x ) = 0 . Formula după care se calculează o rădăcină aproximativă în
funcţie de rădăcina aproximativă din iteraţia anterioară este următoarea:
F (x n −1 )
x n = x n −1 − ( 7.22)
F' (x n −1 )
unde x n este valoarea lui x în iteraţia n iar x n−1 este valoarea lui x în
iteraţia anterioară.
Condiţiile de convergenţă sunt:

• Să se plece cu o valoare iniţială a rădăcinii aproximative x 0 suficient de


apropiată de o rădăcină a ecuaţiei

• Este necesar ca derivata secundă a funcţiei F" (x ) să nu fie prea mare,

• Este necesar ca derivata primă a funcţiei F' (x ) să nu fie prea apropiată


de zero. De fapt, ultimele două condiţii cer ca ecuaţia să nu aibă două
rădăcini foarte apropiate.
Ieşirea din procesul iterativ se face fie când s-a atins precizia cerută (
abs(x n − x n−1 ) <ε ) fie când s-a atins un număr maxim de iteraţii, itermax.
În continuare este prezentat programul în TP pentru găsirea rădăcinilor
ecuaţiei
f ( x ) = x 4 − 9 ⋅ x 3 − 2 ⋅ x 2 + 120 ⋅ x − 130 = 0 cu metoda Newton.

EX28.PAS
program rezec4_2; label 10, 20;
const eps=1.E-05; itermax=30;
type intx=array[1..4] of real;
const x1:intx=(-4, 1, 3, 7);

var x0,x:real;
i, iter:byte;
function f(x:real):real;
begin
f:=sqr(x)*sqr(x)-9*sqr(x)*x-2*x*x+120*x-130;
end;
function df(x:real):real;
begin
df:= 4*sqr(x)*x-27*sqr(x)-4*x+120;
end;

BEGIN {programul principal}


for i:= 1 to 4 do
begin
x0:=x1[i];

108
Algoritmi Complecşi

for iter:=1 to itermax do


begin
20: x:= x0 - f(x0)/df(x0);
if abs(x-x0)<eps goto 10
else
begin
x0:=x;
goto 20;
end;
end;

10:writeln(’la iteratia’,iter:2,’x[’,i:1,’]=’,x:10:2;
end;
readln;
END.

7.4.3. Metoda Birge-Vieta

În cele 2 metode descrise mai sus programele sunt scrise pentru o


anumită ecuaţie. Programele trebuie să aibă însă un caracter mai general.
Acest lucru este posibil în cazul când F(x) este un polinom, adică
F ( x ) = am ⋅ x m + am −1 ⋅ x m −1 + am −2 ⋅ x m −2 +  + a1 ⋅ x 1 + a0 ( 0.8)
Pentru scrierea unei soluţii generale pentru ecuaţia algebrică vei folosi tot
metoda Newton-Raphson dar pentru evaluarea lui F(x 0 ) şi a lui F’(x 0 ) vei
folosi următorul algoritm. Vei scrie polinomul F(x) sub forma
F ( x ) = Q( x ) ⋅ (x − x0 ) + b0 ( 7.23)
cu
Q( x ) = bm ⋅ x m −1 + bm −1 ⋅ x m −2 +  + b2 ⋅ x 1 + b1 ( 7.24)
Observă că
F ( x 0 ) = b0 ( 7.25)
şi că
F' ( x 0 ) = Q (x 0 ) ( 7.26)
Problema se reduce deci la a evalua b 0 şi Q(x 0 ). Scriind şi Q(x) ca
Q( x ) = R( x ) ⋅ (x − x 0 ) + c1 ( 7.27)
cu
R( x ) = c m ⋅ x m −2 + c m −1 ⋅ x m −3 +  + c 3 ⋅ x + c 2 ( 7.28)
se vede că
Q(x 0 ) = c 1 ( 7.29)
Aşadar trebuie să calculezi b 0 şi c 1 pentru fiecare x 0 în decursul iteraţiilor
de găsire a unei rădăcini a polinomului, expresia
F (x 0 )
x = x0 − ( 7.30)
F' (x 0 )
având acum forma
b
x = x0 − 0 ( 7.31)
c1

109
Algoritmi Complecşi

Dacă înlocuieşti în ecuaţia (7.24) F ( x ) = Q( x ) ⋅ (x − x0 ) + b0 expresiile


polinoamelor F(x) şi Q(x) obţii
am ⋅ x + am −1 ⋅ x
m −1
m
+ am −2 ⋅ x m −2 +  + a1 ⋅ x 1 + a0 =
 ( 7.32)
( )
= (x − x 0 ) ⋅ bm ⋅ x m −1 + bm −1 ⋅ x m −2 +  + b2 ⋅ x 1 + b1 + b0
şi identificând coeficienţii diferitelor puteri ale lui x obţii expresiile
coeficienţilor b j :
bm = am
 ( 7.33)
b j = a j + b j +1 ⋅ x 0
cu j mergând de la m-1 la 0. La fel introducând în ecuaţia ( 7.34)
Q( x ) = R( x ) ⋅ (x − x 0 ) + c1 expresiile lui Q(x) şi R(x), vei obţine:
bm ⋅ x m −1 + bm −1 ⋅ x m −2 +  + b2 ⋅ x 1 + b1 =
 ( 7.35)
( )
= (x − x 0 ) ⋅ c m ⋅ x m −2 + c m −1 ⋅ x m −3 +  + c 3 ⋅ x + c 2 + c1
de unde, prin identificarea coeficienţilor puterilor lui x, vei găsi relaţiile
pentru coeficienţii c k
c m = bm
 ( 7.36)
c k = bk + c j +1 ⋅ x 0
unde k ia valori de la m-1 la 1.

În continuare poţi urmări paşii programul în TP pentru găsirea rădăcinilor


polinomului F(x) folosind această procedură numită deseori metode Birge-
Vieta.

EX29.PAS program rezec4_3; l

abel 10, 20, 30;


const eps=1.E-05; itermax=30;
var x0,x:real; {variabile globale}
a:array[0..20] of real;
b:array[0..20] of real;
i, iter, m:byte;

function b0(x:real):real;
var j:byte; {variabila locala}
begin
b[m]:=a[m];
for j:=m-1 downto 0 do b[j]:= b[j+1]*x +a[j];
b0:=b[0];
end;
function c1(x:real):real;
var k:byte; {variabile locale}
c:array[1..20] of real;
begin
c[m]:=b[m];
for k:=m-1 downto 1 do c[k]:=c[K+1]*x+b[k];
c1:=c[1];
end;

110
Algoritmi Complecşi

BEGIN {programul principal}


write(’introdu gradul polinomului,m=’); readln(m);
writeln(’introdu coef.polinom am*x^m+...+a1*x+a0’);
for i:=m downto 0 do
begin
write(’introdu a(’,i:2,’)=’); readln(a[i])
end;
30: write(’introdu x0=’); readln(x0);
for iter:=1 to itermax do
begin
20: x:= x0 - b0(x0)/c1(x0);
if abs(x-x0)<eps goto 10
else
begin
x0:=x; goto 20;
end;
end;
10: writeln(’la iteratia’,iter:2,’radacina
este’,x:10:2);
Write(’introdu 1 pentru alta radacina’);
readln(ic);
if ic=1 then goto 30
readln;
END.

Încercă şi acest program pentru rezolvarea ecuaţiei


f ( x ) = x 4 − 9 ⋅ x 3 − 2 ⋅ x 2 + 120 ⋅ x − 130 = 0
Ai găsit aceleaşi rădăcini?

7.5. Rezolvarea sistemelor de ecuaţii algebrice liniare

Consideră un sistem de n ecuaţii algebrice liniare. Vei spune că un sistem


de n valori, corespunzătoare celor n variabile, este o soluţie a acestui
sistem
de ecuaţii dacă, înlocuind variabilele cu aceste valori toate cele n ecuaţii
sunt satisfăcute simultan. Aşa cum probabil ştii, pentru un sistem de
ecuaţii dat nu putem spune, fără un studiu, dacă există o soluţie şi dacă
această soluţie este unică. Există două categorii de metode numerice de
rezolvare a sistemelor de ecuaţii algebrice liniare: metodele directe care
presupun un număr finit de operaţii (metoda Gauss-Jordan) şi metodele
iterative care implică un număr foarte mare de operaţii (metoda Gauss-
Seidel). Ambele metode au avantaje şi limite de utilizare. Un studiu
detaliat asupra aplicării metodelor de rezolvare este făcut în cartea aflată
în bibliografia generală la numărul [5].

111
Algoritmi Complecşi

7.5.1. Metoda Gauss-Seidel

Poţi urmări principiul metodei de rezolvare pe cazul unui sistem de 3


ecuaţii algebrice liniare:
a11 ⋅ x1 + a12 ⋅ x 2 + a13 ⋅ x 3 = b1

a21 ⋅ x1 + a22 ⋅ x 2 + a23 ⋅ x 3 = b2 ( 7.37)
a ⋅ x + a ⋅ x + a ⋅ x = b
 31 1 32 2 33 3 3

Presupune că elementele diagonale sunt nenule


a11 ≠ 0

a22 ≠ 0 ( 7.38)
a ≠ 0
 33
În acest caz ecuaţiile de mai sus se pot scrie sub forma.
 1
 x1 = (b1 − a12 ⋅ x 2 − a13 ⋅ x 3 )
 a11
 1
x 2 = (b2 − a21 ⋅ x1 − a23 ⋅ x 3 ) ( 7.39)
 a22
 1
x 3 = (b3 − a31 ⋅ x1 − a32 ⋅ x 2 )
 a33
( )
Pornind cu o soluţie aproximativă a sistemului de ecuaţii, x1( 0 ) , x 2( 0 ) , x 3( 0 ) şi
înlocuind-o în sistemul (7.39) vei obţine o nouă aproximaţie a
necunoscutelor x i :
 (1 ) 1
 x1 =
a11
( )
b1 − a12 ⋅ x 2( 0 ) − a13 ⋅ x 3( 0 )

 (1 ) 1
x 2 =
a
( )
b2 − a21 ⋅ x1(1 ) − a23 ⋅ x 3( 0 ) ( 7.40)
 22
 (1 ) 1
x 3 =
a33
( )
b3 − a31 ⋅ x1(1 ) − a32 ⋅ x 2(1 )

Procedura continuă cât timp

( ( ))
MAX ABS x i( k ) − x i( k −1 ) > ε ( 7.41)
unde
• ε reprezintă precizia cu care vrei să găseşti soluţia
• k este numărul iteraţiei curente şi k-1 este numărul iteraţiei anterioare
• i merge de la 1 la numărul de necunoscute ale sistemului

sau cât timp nu ai atins numărul maxim de iteraţii stabilit prin program,
itermax.

Iată un programul în TP care rezolvă aproximativ sisteme lineare conform


algoritmului propus mai sus:

112
Algoritmi Complecşi

EX30.PAS

program gauss_seidel;
label unu, doi, trei;
type matrice=array[1..10,1..10] of real;
vector=array[1..10] of real;
const eps=1.E-04; itermax=50;
var n, i, j, iter:byte;
a:matrice;
b, x:vector;
f:text;
big, sum, temp:real;
begin assign(f,’gs.in’); reset(f); readln(f,n);
for i:=1 to n do
begin
for j:=1 to n do read(f,a[i, j]);
readln(f,b[i]);
end;
for i:=1 to n do if a[i,i]=0 then goto unu;
writeln(’ sistemul de ecuatii este:’);
for i:=1 to n do
begin
forj:=1 to n do
write(a[i,j]:10:2);write(b[i]:10:2);
writeln;
end;
for i:=1 to n do x[i]:=0.;
for iter:=1 to itermax do
begin
big:=0.;
for i:=1 to n do
begin
sum:=0;for j:=1 to i-1 do
sum:=sum+a[i,j]*x[j];
for j:=i+1 to n do sum:=sum+a[i,j]*x[j];
temp:=(b[i]-sum)/a[i,i];
if abs(temp-x[i])> big then big:=abs(temp-x[i]);
x[i]:=temp;
end;
if big <= eps then goto trei;
end;
trei:Writeln(’la iteratia:’,iter:2,’solutia este:’);
for i:=1 to n do writeln(’x(’,i:2,’)=’,x[i]:10:2);
goto doi;
unu:writeln(’sistemul nu poate fi rezolvat prin
metoda Gauss Seidel’);
doi: readln;
end.

113
Algoritmi Complecşi

Pentru rezolvarea sistemului de ecuaţii algebrice liniare:


4 ⋅ x − x − x = −1
 1 2 3

 − x1 + 4 x 2 − x 3 − x 4 = 2

 − x1 − x 2 + 4 x 3 − x 4 − x 5 = 6 ( 7.42)

 − x2 − x3 + 4 x4 − x5 = 2
 − x3 − x4 + 4 x5 = −1

fişierul gs.in va avea conţinutul:
5
4. -1. -1. 0. 0. -1.
-1. 4. -1. -1. 0. 2.
-1. -1. 4. -1. -1. 6.
0. -1. -1. 4. -1. 2.
0. 0. -1. -1. 4. -1.

Soluţia este x 1 = 1, x 2 = 2, x 3 = 3, x 4 = 2 şi x 5 = 1

7.5.2. Metoda Gauss-Jordan

Consideră din nou sistemul de ecuaţii algebrice liniare (7.37). Consideră



a11 ≠ 0 ( 7.43)
ceea ce – evident – nu este o restricţie (sistemul are cel puţin un coeficient
nenul). Dacă în forma primară a11 = 0 ecuaţiile se rearanjează pentru a
satisface condiţia. Defineşte multiplicatorul
a
m1 = 21 ( 7.44)
a11
înmulţeşte prima ecuaţie a sistemului (7.37) cu m 1 şi scade-o din a doua
ecuaţie. Defineşte şi multiplicatorul
a
m2 = 31 ( 7.45)
a11
cu care înmulţeşte prima ecuaţie a sistemului după care scade-o din a
treia. Noul sistem de ecuaţii are forma
a11 ⋅ x1 + a12 ⋅ x 2 + a13 ⋅ x 3 = b1

 a' 22 ⋅x 2 + a23 ⋅ x 3 = b' 2 ( 7.46)
 a' 32 ⋅x 2 + a33 ⋅ x 3 = b' 3

În a doua ecuaţie a sistemului coeficientul necunoscutei x 1 este
a21 − m1 ⋅ a11 = 0 ( 7.47)
iar coeficienţii celorlalte necunoscute şi termenul liber sunt
a' 22 = a22 − m1 ⋅ a12

a' 23 = a23 − m1 ⋅ a13 ( 7.48)
b' = b − m ⋅ b
 2 2 1 1

În a treia ecuaţie a sistemului coeficientul necunoscutei x 1 este


a31 − mm ⋅ a11 = 0 ( 7.49)

114
Algoritmi Complecşi

iar coeficienţii celorlalte necunoscute şi termenul liber sunt


a' 32 = a32 − m2 ⋅ a12

a' 33 = a33 − m2 ⋅ a13 ( 7.50)
b' = b − m ⋅ b
 3 3 2 1

Verifici dacă pentru noul sistem coeficientul necunoscutei x 2 din a doua


ecuaţie este nenul,
a' 22 ≠ 0 ( 7.51)
(dacă nu – rearanjezi sistemul) şi defineşti un nou multiplicator.
a'
m3 = 32 ( 7.52)
a' 22
Înmulţeşti apoi a doua ecuaţie cu multiplicatorul m3 şi o scazi din a treia
ecuaţie. Sistemul are în acest moment forma ”triunghiulară”.
a11 ⋅ x1 + a12 ⋅ x 2 + a13 ⋅ x 3 = b1

 a' 22 ⋅x 2 + a23 ⋅ x 3 = b' 2 ( 7.53)
 a" 33 ⋅x 3 = b" 3

cu coeficienţii ecuaţiei a treia daţi de expresiile
a" 33 = a' 33 −m3 ⋅ a' 23
 ( 7.54)
b" 3 = b' 3 −m3 ⋅ b' 2
Metoda descrisă mai sus este adesea numită metoda reducerii gaussiene.
Astfel, dacă
a' 33 ≠ 0 ( 7.55)
poţi calcula
 b" 3
x 3 =
 a' 33
 1
x 2 = (b' 2 −a' 23 ⋅x 3 ) ( 7.56)
 a' 22
 1
 x1 = (b1 − a12 ⋅ x 2 − a13 ⋅ x 3 )
 a11
Programul TP care implementează metoda se află în fişierul gaussj.inc
şi este luat din biblioteca de subprograme [7]. Vei folosi programul în
studiul metodei celor mai mici pătrate pentru un polinom de grad m > 2 în
unitatea de învăţare următoare.

7.6. Integrarea numerică

Derivarea şi integrarea numerică sunt bine studiate în capitolul 5 al


referinţei bibliografice generale [5]. Vei urmări în continuare descrierea a
două dintre cele mai cunoscute metode de evaluare numerică a
b
integralelor I = ∫ f ( x ) ⋅ dx cu restricţiile că a şi b sunt valori finite iar f(x)
a

este o funcţie continuă pe intervalul [a,b]. Ideea de bază a calculului de


integrală definită este aceea a calculului ariei de sub graficul funcţiei între
punctele a şi b.

115
Algoritmi Complecşi

7.6.1. Metoda trapezelor

Intervalul [a,b] se împarte în n intervale cu lungimi egale. Metoda


trapezelor aproximează integrala cu suma ariilor celor n trapeze de
înălţime h=(b-a)/n, bazele mici respectiv f(a), f(a+h),...,f(a+(n-1)h) şi bazele
mari respectiv f(a+h), f(a+2h),...,f(b). Se vede că exceptând capetele
intervalului, celelalte baze ale trapezelor figurează de 2 ori: o dată ca bază
mică şi o dată ca bază mare - în trapeze succesive. Formula de
aproximare a integralei este:

 h
I ≈ ITrapeze = (y 0 + 2 y 1 + 2 y 2 +  + 2 y n −2 + y n −1 + y n )
 2 ( 7.57)
y i = f (a + ih )

i ia valori între 0 şi n.

7.6.2. Metoda Simpson

Metoda Simpson este una din cele mai folosite metode de integrare
numerică. Ca şi în metoda trapezelor intervalul [a, b] se împarte în n
intervale de lungime egală apărând astfel delimitările intervalelor de valori
ale lui x de forma x i = a + i ⋅ h dar aici se consideră suprafaţa de sub o
parabolă pentru a aproxima aria corespunzătoare la două intervale
adiacente. Situaţia este reprezentată în figura 7.6.

Figura 7.6

Aceasta impune ca n să fie par.


Formula de aproximare este acum dată de:
 h
I ≈ I Simpson = (y 0 + 4 y 1 + 2 y 2 +  + 2 y n −2 + 4 y n −1 + y n )
 3 ( 7.58)
y i = f (a + ih )
EX31.PAS conţine un program în TP care integrează prin cele 2 metode,
expuse mai sus, diferite funcţii f(x) şi compară rezultatele cu valorile
analitice ale integralelor. Din rezultate se vede că integrala prin metoda
trapezelor dă rezultat exact doar pentru f(x) de forma unui polinom de
grad 1 în timp ce metoda Simpson dă rezultat exact pentru f(x) de forma
unui polinom de grad 1, 2 şi 3. Abia pentru polinoame de grad mai înalt
încep să se observe abateri de la valoarea analitică a integralei.

116
Algoritmi Complecşi

EX31.PAS
program integrare;
const a=0.; b=1.;
type fct=function(x:real):real;
var st1, st2, st3, st4, st5:real;
ss1, ss2, ss3, ss4, ss5:real;
function trapez(a,b:real; n:byte; f:fct):real;
var h, s:real; i:byte;
begin
h:=(b-a)/n;
s:=f(a)+f(b);
for i:=1 to n-1 do s:=s+2*f(a+i*h);
trapez:=s*h/2;
end;
function simpson(a, b:real; n:byte; f:fct):real;
var h, s:real; i:byte;
begin
h:=(b-a)/2/n;
s:=f(a)+f(b);
for i:=1 to 2*n-1 do
if i mod 2 = 0 then s:=s+2*f(a+i*h)
else s:=s+4*f(a+i*h);
simpson:=s*h/3;
end;
{$F+} function f1(x:real):real;
begin
f1:=1+x;
end;
function f2(x:real):real;
begin
f2:=1+x*x;
end;
function f3(x:real):real;
begin
f3:=1+sqr(x)*x;
end;
function f4(x:real):real;
begin
f4:=1+sqr(x)*sqr(x);
end;
function f5(x:real):real;
begin f5:=1+sqr(x)*sqr(x)*x;
end;
{$F-}
begin
st1:=trapez(a,b,10,f1);
ss1:=simpson(a,b,10,f1);
writeln(’ functia|val.int. analitica|val.int. trapez|
val.int. simpson’);
writeln(’ 1+x ’, 1.5:16:6, st1:18:6,ss1:18:6);
st2:=trapez(a,b,10,f2);
ss2:=simpson(a,b,10,f2);

117
Algoritmi Complecşi

writeln(’ 1+x^2’,1.333333:16:6,st2:18:6,ss2:18:6);
st3:=trapez(a,b,10,f3);
ss3:=simpson(a,b,10,f3);
writeln(’ 1+x^3’,1.25:16:6,st3:18:6,ss3:18:6);
st4:=trapez(a,b,10,f4);
ss4:=simpson(a,b,10,f4);
writeln(’ 1+x^4’,1.2:16:6,st4:18:6,ss4:18:6);
st5:=trapez(a,b,10,f5);
ss5:=simpson(a,b,10,f5);
writeln(’1+x^5’,1.166666:16:6,st5:18:6,ss5:18:6);
readln;
end.

7.7. Integrarea numerică a ecuaţiilor diferenţiale de ordin 1

Ecuaţia
dy
=y ( 7.59)
dx
are ca soluţie o funcţie de forma
y( x ) = a ⋅ e x ( 7.60)
unde a este o constantă arbitrară. Valori diferite ale constantei a conduc
la o familie de curbe care satisfac ecuaţia diferenţială (7.59). Constanta a
este unic determinată dacă pe lângă ecuaţia diferenţială se mai dă şi o
valoare a lui y pentru un x oarecare - o condiţie iniţială. De exemplu dacă
la x = 0, y = 1 ( y ( 0 ) = 1 ) atunci a = 1 şi y ( x ) = e x .

Există o serie de tehnici pentru determinarea soluţiei unei ecuaţii


diferenţiale sub forma unor funcţii elementare sau a unor funcţii speciale,
ca de exemplu funcţiile Bessel. Deseori apar probleme care nu pot fi
rezolvate prin metode clasice sau care conduc la soluţii dificil de obţinut.
Vei căuta atunci aproximaţii numerice.
Pentru ecuaţii diferenţiale ordinare de ordinul întâi cu o singură condiţie
iniţială
 y' = f ( x , y )
 ( 7.61)
 y (x 0 ) = y 0
metodele Runge - Kutta sunt cele mai cunoscute.
Metodele Runge-Kutta de care te vei ocupa în continuare, au trei
proprietăţi speciale :

1. sunt metode directe. Informaţiile pe care le primeşti prin enunţul


descris mai sus sunt suficiente pentru a amorsa o metodă în care soluţia
(care este o funcţie y ( x ) ) este determinată numeric, iterativ.
Aceasta înseamnă că plecând de la condiţia iniţială se pot determina
punctele care constituie soluţia (x m , y (x m )) printr-o metodă iterativă în
care se foloseşte valoarea soluţiei existente în punctul precedent xm, ym
pentru a găsi ym+1

118
Algoritmi Complecşi

2. sunt identice cu seriile Taylor până la termeni hp unde p este diferit


pentru metode diferite, fiind numit ordinul metodei

3. nu necesită evaluarea nici unei derivate a funcţiei f(x, y) ci numai a


funcţiei f

7.7.1. Metoda Runge-Kutta de ordin 4

Pentru metoda Runge - Kutta de ordin 4, una din cele mai răspândite
metode de integrare a ecuaţiilor diferenţiale ordinare, formula de calcul
este:
h
y m +1 = y m + (k1 + 2 k 2 + 2 k 3 + k 4 ) ( 7.62)
6
unde
k1 = f (x m , y m )

k = f  x + h , y + hk1 
2 m m
  2 2 
 ( 7.63)
k = f  x + h , y + hk 2 
 3 
m
2
m
2 

k 4 = f (x m + h, y m + hk 3 )
Eroarea de trunchiere este ε ≈ K ⋅ h 5 .
Se observă că în această metodă funcţia trebuie evaluată de 4 ori.
Estimarea erorii de trunchiere presupune că derivatele parţiale de ordinul
4 ale funcţiei f(x, y) sunt continue.
Să considerăm împreună exemplul unei ecuaţii diferenţiale simple cu o
condiţie iniţială dată
 dy
 =y
 dx ( 7.64)
y (0 ) = 1
Folosind formulele de mai sus, se pot calcula valorile y ( h ) , h fiind pasul
cu care este parcurs domeniul valorilor variabilei x.
k1 = y m

k 2 = y m + hk1
 2

k = y + h  y + hk1  ( 7.65)
 3 m
2
m
2 

  h hk1  
k 4 = y m + h y m + 2  y m + 2  
   
astfel că, în conformitate cu relaţia (7.62)
 h2 h3 h4 
y m +1 = y m ⋅ 1 + h + + +  ( 7.66)
 2 6 24 
identică cu dezvoltarea în serie Taylor a funcţiei eh în vecinătatea
punctului h=0 până la termenul în h4.
Programul EX32.PAS care foloseşte subrutina RK4 pentru a integra
numeric ecuaţia dy / dx = y ; y ( 0 ) = 1 pentru x ∈ (0 ,1) cu pas 0.1 este

119
Algoritmi Complecşi

prezentat în continuare. Ţi-ar fi util să compari rezultatele programului cu


soluţia exactă, analitică.

EX32.PAS
program ec_dif;
const h=0.1; n=10;
var x, y, k1, k2, k3, k4, x0, y0 : real;
i:byte;
function f(x, y : real) : real;

begin
f:=exp(x);
end;
begin
x0:=0; y0:=1; {valorile initiale}
writeln(’x| valoarea analitica|valoarea
calculata’);
for i:=1 to n do
begin
k1:=f(x0,y0); k2:=f(x0+h/2, y0+h*k1/2);
k3:=f(x0+h/2, y0+h*k2/2);
k4:=f(x0+h,y0+h*k3);
y:=y0+h/6*(k1+2*k2+2*k3+k4);
writeln(x0+h:5:2,exp(x0+h):20:6,y:20:6);
x0:=x0+h; y0:=y;
end;
readln;
end.

Reţine că pentru integrarea unui sistem de ecuaţii diferenţiale de ordinul


întâi poţi folosi procedura rk4 din trimiterea bibliografică generală [7]
salvată în fişierul rk4.inc. Vei folosi procedura în unitatea de învăţare 9
pentru integrarea ecuaţiilor mişcării particulei α în câmpul Coulomb al
unui nucleu de Au sau Ag. Procedura este prezentată mai jos.

PROCEDURE rk4(y,dydx: glnarray;n:integer;x,h:real;


VAR yout:glnarray);
{* Programele ce folosesc procedura RK4 trebuie
sa aibă o procedura PROCEDURE derivs(x:real;
y:glnarray; VAR dydx:glnarray); in care sunt
calculate derivatele dydx la valoarea x, fiind
date valoarea lui x si valorile functiilor y(x).
De asemeni programul apelant al procedurii rk4
trebuie sa defineasca tipul TYPE glnarray =
ARRAY [1..nvar] OF real;
unde nvar este numarul de variabile y. *}
VAR
i: integer;
xh,hh,h6: real;
dym,dyt,yt: glnarray;
BEGIN
hh := h*0.5;

120
Algoritmi Complecşi

h6 := h/6.0;
xh := x+hh;
FOR i := 1 to n DO BEGIN
yt[i] := y[i]+hh*dydx[i]
END;
derivs(xh,yt,dyt);
FOR i := 1 to n DO BEGIN
yt[i] := y[i]+hh*dyt[i]
END;
derivs(xh,yt,dym);
FOR i := 1 to n DO BEGIN
yt[i] := y[i]+h*dym[i];
dym[i] := dyt[i]+dym[i]

END;
derivs(x+h,yt,dyt);
FOR i := 1 to n DO BEGIN
yout[i]:=y[i]+h6*(dydx[i]+dyt[i]+2.0*dym[i])
END
END;

7.8. Metoda Monte Carlo

Pentru rezolvarea unei probleme matematice prin metoda încercărilor


statistice [6] se construieşte pentru problemă un proces aleator cu
parametri egali cu mărimile căutate ale problemei. Prin aceasta,
determinarea aproximativă a acestor mărimi are loc pe calea observării
procesului aleator şi a calculului caracteristicilor lui statistice egale
aproximativ cu parametrii căutaţi. Calculul pentru o probă presupune 104
− 106 încercări; pentru folosirea metodei sunt necesare calculatoare
performante - care există astăzi curent.
Caracteristicile metodei au determinat folosirea sa într-o varietate de
domenii.
Un exemplu simplu este calculul integralei
1
I = ∫ x ⋅ dx ( 7.67)
0

Problema revine la calculul ariei de sub graficul funcţiei. Aşa cum se vede
şi în figura 7.4, graficul este încadrat în pătratul 0 ≤ x ≤ 1; 0 ≤ x ≤ 1
Problema revine la calculul ariei de sub graficul funcţiei. Aşa cum se vede
şi în figura 7.4, graficul este încadrat în pătratul 0 ≤ x ≤ 1; 0 ≤ x ≤ 1

Figura 7.7

121
Algoritmi Complecşi

Deoarece analitic valoarea integralei este I = 2 / 3 raportul ariei de sub


curbă la aria pătratului unitate este 2/3.
Pentru a rezolva problema prin metoda Monte Carlo , se folosesc
numerele aleatoare astfel:

1. se ia un număr aleator şi se plasează pe axa Ox


2. se ia radical din acest număr aleator şi se pune pe grafic punctul de
coordonate (x, y = x1/2)
3. se ia un alt număr aleator; el poate fi mai mare decât x1/2 şi atunci
punctul pe care îl determină se află în afara ariei dintre axa Ox şi curba
funcţiei, sau poate fi mai mic decât x1/2 şi atunci punctul determinat se
află în interiorul ariei determinate de graficul funcţiei. În
acest ultim caz, în care punctul a căzut în aria de interes, un contor , N1
este incrementat ( crescut) cu o unitate.
4.Toate încercările sunt numărate de un alt contor, N.

După un număr mare de încercări, o estimare a ariei de sub curbă este


dată de raportul N1/N .
Cât de bună este această estimare?
Probabilitatea a N1 reuşite din N încercări independente este dată de
funcţia de distribuţie binomială:
N!
B (N1 , N , p ) = p N1 q N −N1 ( 7.68)
N1 ! (N − N1 )!
unde q = 1 − p iar p este probabilitatea de reuşită la o încercare (pentru
cazul considerat p=2/3)
Valoarea aşteptată a lui N1 este dată de media ponderată

E ( N1 ) = ∑ N B(N ,N , p ) = Np
N1 =0
1 1 ( 7.69)

amintindu-ne că B(N1 , N, p) este normată la unitate ca orice funcţie de


distribuţie. Valoarea aşteptată a pătratului abaterii de la medie sau
varianta lui N1 faţă de medie este
[ 2
] ( )
var (N1 ) = E (N1 − Np ) = E N12 − [E (N1 )] =
2

( 7.70)
N (N − 1)p 2 + Np − N 2 p 2 = Np(1 − p ) = Npq
Abaterea standard este
[ ]
σ (N1 ) = ± E (N1 − Np )2 = ±(Npq )1 / 2 ( 7.71)
Deviaţia standard a estimării N1/N a ariei de sub curba y = x1/2 este
 N  var (N1 ) Npq pq
var  1  ≡ = 2 = ( 7.72)
N  N2 N N
 N1  pq
σ =± ( 7.73)
N  N
Pentru cazul considerat la N=100 valoarea aşteptată pentru N1 este
2 2 1 10
aproximativ 100 ⋅ , N1 ≈ 0 ,67 iar σ ( N1 ) = 100 ⋅ ⋅ ≈ 2
3 3 3 3
N 
şi σ  1  ≈
(2 / 3 )(1 / 3 ) = 2 ≈ 0.047 sau ε ≈ 0.047 ≈ 7%
N  100 30 2/3

122
Algoritmi Complecşi

Aşadar, eroarea relativă a determinării integralei prin metoda Monte Carlo


este de 7% pentru N=100 – un rezultat absolut acceptabil pentru un
număr atât de mic de încercări. După ce ai urmărit exemplul descris, se
poate face o generalizare a calculului integralei definite pentru o funcţie
oarecare
b
y = ∫ f ( x ) ⋅ dx ( 7.74)
a

cu aceeaşi metodă. «Pornirea» metodei Monte Carlo se face dacă


defineşti un dreptunghi «de ţintă» după cum urmează
ℜ = {a ≤ x ≤ b,0 ≤ f ( x ) ≤ c} ( 7.75)
c fiind valoarea maximă din domeniu a funcţiei.
Pentru puncte generate aleator şi “aruncate” spre dreptunghiul definit mai
sus, raportul dintre numărul de puncte N1 care cad între graficul funcţiei şi
axa Ox şi numărul total de puncte aruncate N există relaţia
b

N1 ∫a
f ( x )dx
≈ ( 7.76)
N ( b − a )c
de unde înţelegi că
b
N1
∫a f ( x )dx ≈
N
( b − a )c ( 7.77)

este valoarea aproximativă a integralei.


Practic, pentru fiecare punct generat aleator (ξ i ,η i ) se verifică
respectarea condiţiei
η i ≤ f (ξ i ) ( 7.78)
Respectarea condiţiei produce creşterea cu o unitate a contorului N1
După N încercări se calculează valoarea aproximativă a integralei.
O problemă pe care ai sesizat-o probabil, este că nu s-a stabilit o cale
prin care folosind un număr aleator cu valori cuprinse între 0 şi 1 să se
producă perechea de coordonate pentru fiecare punct ce urmează să fie
plasata în domeniul dreptunghiular. Algoritmul respectiv va fi tratat ceva
mai târziu. Gândeşte-te deja la o soluţie posibilă.
În continuare urmăreşte o altă metodă de evaluare Monte Carlo a
b
integralei I = ∫ f ( x )dx . Dacă notezi ξ o mărime aleatoare distribuită
a

uniform în domeniu (a, b ) cu densitatea de probabilitate


1 /( b − a ) dacă x ∈ (a, b )
pξ ( x ) =  ( 7.79)
0 dacă x ∉ (a, b )
Poţi defini o speranţă matematică a funcţiei f (ξ ) cu expresia
b
1
E [f (ξ )] = ∫ f ( x )pξ ( x )dx =
I ( 7.80)
a
b−a
Presupune că se fac N încercări în urma cărora se obţin valorile
ξ1 ,ξ 2 , ,ξ N ale mărimii aleatoare ξ . Deoarece pentru numere mari
speranţa matematică a funcţiei este dată de
1 N
E [f (ξ )] ≈ ∑ f (ξ i ) ( 7.81)
N i =1

123
Algoritmi Complecşi

rezultă că pentru un număr suficient de mare de încercări


b−a N
I≈ ∑ f (ξ i )
N i =1
( 7.82)

7.8.1. Numere aleatoare

Din exemplele de mai sus ai văzut că pentru utilizarea metodei Monte


Carlo este necesar să producem valori aleatoare ale unor parametri;
pentru realizarea acestei cerinţe este nevoie să ai acces la o sursă
oarecare de numere aleatoare uniform distribuite în intervalul [0, 1).
Există liste cu astfel de numere generate aleator şi există algoritmi de
generare pe calculatoarele digitale. De fapt calculatoarele operează cu
numere pseudo-aleatoare care satisfac condiţiile pentru numere
aleatoare pe o probă dată ( perioadă ) de numere. Întotdeauna trebuie
făcut testul distribuţiei uniforme pe intervalul [0, 1) a numerelor generate.
Există rutine de generare a numerelor pseudo-aleatoare fie uniform
distribuite fie distribuite Gauss ( urmăreşte de exemplu problema în
referinţa bibliografică generală [9]).

7.8.2. Principiul fundamental al metodei Monte Carlo

cazul discret
Gândeşte-te la E1, E2, ..., En evenimente independente care se exclud
reciproc şi care se produc cu probabilităţile p1, p2, ..., pn astfel încât
p1 + p2 +  + pn = 1 ( 7.83)
Un număr aleator, r, uniform distribuit în intervalul [0, 1) care satisface
relaţia:
p1 + p2 +  + pi −1 ≤ r ≤ p1 + p2 +  + pi ( 7.84)
va determina evenimentul Ei . Acesta este principiul fundamental al
metodei Monte Carlo aşa cum se aplică la cazul discret al unui număr
finit de evenimente.

cazul continuu
În cazul unei variabile x care variază continuu pe un interval [a, b), care
are probabilitatea p(x)dx ca x să se găsească în intervalul x, x+ dx şi
pentru care
b

∫ p( x )dx = 1
a
( 7.85)

relaţia
x
r = ∫ p(ξ )dξ ( 7.86)
a

determină unic pe x ca funcţie de r. Acesta este principiul metodei


Monte Carlo – aşa cum se aplică el pentru variabile continue.

124
Algoritmi Complecşi

7.8.2.1. Exemplul 1
Fie x uniform distribuit pe intervalul [a, b]. Atunci probabilitatea ca x să ia
valori în intervalul x, x+dx este p(x)dx = dx / (b-a). Aplicând principiul
metodei MC pentru cazul continuu

r =∫
x

=
(x − a ) ( 7.87)
a
b − a (b − a )
de unde
x = a + r (b − a ) ( 7.88)
ne dă legătura între numărul aleator r uniform distribuit pe intervalul [0,1)
şi mărimea de interes, x. Relaţia este folosită la calculul integralei prin
metode MC pentru obţinerea lui x şi y pe intervalele [a,b] şi, respectiv
[0,c] unde c este o valoare egală sau mai mare decât cea mai mare
valoare a lui f(x) în intervalul [a,b], presupunând că f ( x ) ≥ 0 în acest
interval.
Dacă vei analiza următorul program vei vedea că acesta calculează
1


0
x dx prin prima metodă Monte Carlo – aşa cum aceasta a fost expusă

la începutul unităţii de învăţare.

EX33.PAS
program intmc; {integrala prin metoda Monte Carlo}
const n=1000; a=0; b=1;
{n=numar de numere aleatoare de generat
a, b=limitele inferioara si superioara ale
integralei}
var i, r, n1:word;
x, y, smc:real;
function f(x:real):real;
begin
f:=sqrt(x); {functia de integrat}
end;
begin
n1:=0; randomize;
for i:=1 to n do
begin
x:=random(100)/100.; y:=random(100)/100.;
if y<=f(x) then n1:=n1+1;
end;
smc:=1.*n1/n; writeln(’ int.mc. = ’,smc:10:4);
readln;
end.

125
Algoritmi Complecşi

Rulând programul vei înţelege ce înseamnă – pentru precizia rezultatului


– creşterea numărului de probe şi de asemenea care este importanţa
folosirii de numere cu adevărat aleatoare.

Programul EX34.PAS calculează prin cele două metode Monte Carlo


1
integrala ∫ f ( x ) ⋅ dx pentru forme ale lui f(x) deja considerate în
0

EX31.PAS Calculează şi compară rezultatele cu cele date de metodele


trapezelor şi Simpson.

EX34.PAS

program intmc; {integrala prin metoda Monte Carlo}


const n=10000; a=0; b=1;
{n=numar de numere aleatoare de generat
a,b=limitele inferioara si superioara ale
integralei}
c=2 {valoarea maxima a functiei pe intervalul 0,a}
var i, r, n1:word;
x, y, smc:real;
function f(x:real):real;
begin
f:=1+x; {functia de integrat}
end;
begin
n1:=0;randomize; {primul algoritm}
for i:=1 to n do begin
x:=random(100)/100.; y:=c*random(100)/100.;
if y<=f(x) then n1:=n1+1;
end;
smc:=c*(b-a)*n1/n;
writeln(’ int.mc. 1= ’,smc:10:4); readln;
{al doilea algoritm}
smc:=0; for i:=1 to n do
begin
x:=random(100)/100.; smc:=smc+f(x);
end;
smc:=smc*(b-a)/n; writeln(’ int.mc. 2=’,smc:10:4);
readln; end.

Într-un al doilea exemplu ţi se propune rezolvarea unei probleme de


fizică nucleară folosind metoda MC.

Consideră o substanţă radioactivă depusă uniform într-un strat subţire pe


un suport în formă de inel de raze R0 < R1 (fig.7.8). Determină
coordonatele x şi y ale punctului din care este emisă la un moment dat o
particulă din sursa radioactivă.
Probabilitatea emisiei este proporţională cu arie suprafeţei emiţătoare;
prin urmare
dS 2π ⋅ R ⋅ dR
p( R )dR = = ( 7.89)
S (
π R12 − R02 )
126
Algoritmi Complecşi

Figura 7.8
O sursă radioactivă uniform depusă pe un inel de raze R0 şi R1

Aplicând principiul fundamental al metodei Monte Carlo în cazul continuu


R
r = ∫ p( ρ )dρ = 2
2
R
( )
R 2 − R02
R1 − R02 R∫0
ρ ⋅ dρ = 2 ( 7.90)
R0 ( ) (
R1 − R02)
astfel că
(
R = R02 + r ⋅ R12 − R02 ) ( 7.91)
În ceea ce priveşte unghiului θ care este uniform distribuit pe intervalul
[0, 2π], densitatea de probabilitatea are expresia

p( θ )dθ = ( 7.92)

şi
θ
θ
r = ∫ p(Ψ )dΨ = ( 7.93)
0

de unde
θ = 2π ⋅ r ( 7.94)
Astfel
 x = R cos θ
 ( 7.95)
y = R sin θ

Programul EX35.PAS propune o soluţie a problemei enunţate. Poţi


schimba valoarea constantei N. Ai putea lua - de exemplu - n=10 şi apoi
n=1000 . Rulează programul pentru cele 2 valori ale lui n. Ce observi?
Numerele sunt uniform distribuite pe suprafaţa inelului dar un punct este
aleator în sensul că generând un punct el se poate afla oriunde pe
suprafaţa inelului. Concluzia pe care poţi s-o tragi este că generarea se
face uniform pe tot inelul dar că nu poţi prezice unde anume , la un
moment dat se produce emisia.

127
Algoritmi Complecşi

EX35. PAS
program sursarad; {sursa radioactiva distribuita
uniform pe un inel de raze R0,R1}
uses graph;
const n=10; r0=50.; r1=70; {sau n=1000 sau orice
alta valoare in domeniul WORD}
{n=numar de numere aleatoare de generat si razele
inelului}
pi=3.14159;
var i:word;
x, y :array[1..n] of integer;
r, raza, teta:real;
procedure grafica;
var i:word; gd, gm:integer;
xc,yc:word;
begin
gd:=detect; Initgraph(gd,gm,’c:\tp\bgi’);
xc:=300; yc:=200;
{coordonatele centrului sistemului de referinta}
setbkcolor(15); setcolor(1);
moveto(0,yc); lineto(600,yc); outtextxy(610,yc,’X’);
{axe X}
moveto(xc,0); lineto(xc,400); outtextxy(xc,10,’Y’);
{axa Y}
circle(xc,yc,50); circle(xc,yc,70);
{cele 2 cercuri ce definesc inelul}
for i:=1 to n do
putpixel(xc+x[i],yc+y[i],4);
end; {end procedura grafica}

begin
randomize;
for i:=1 to n do
begin
r:=random(100)/100.; {r intre 0 si 1}
raza:=sqrt(r0*r0 +r*(r1*r1-r0*r0));
r:=random(100)/100.; {alt r intre 0 si 1}
teta:=2*pi*r;
x[i]:=trunc(raza*cos(teta));
y[i]:=trunc(raza*sin(teta));
end;
{for i:=1 to n do writeln(x[i]:10,y[i]:10); readln;}
grafica;
readln;
end.

128
Algoritmi Complecşi

7.9. Test de autoevaluare 2

11..Descie scrierea poziţională a unui număr.

2..Decide dacă poate avea rădăcini în intervalul (a, b ) o funcţie


polinomială pentru care f (a ) ⋅ f (b ) > 0 .

3.. Descrie o metodă rapidă de determinare a intervalelor în care se


pot afla rădăcinile unei funcţii polinomiale

4. Scrie care este înţelesul integralei definite a funcţiei f, pozitive, pe


intervalul (a, b ) .

5. Scrie relaţia recurentă de rezolvare a ecuaţiilor diferenţiale cu


metoda Runge Kutta de ordin 4.

Răspunsurile le găseşti la pagina 129

7.10. Răspunsuri la testele de autoevaluare

TTeessttuull ddee aauuttooeevvaalluuaarree 11


1. Patru. Zecimal, binar, octal, hexazecimal.
2. Metoda împărţirilor repetate la 2.
3. Metoda înmulţirilor repetate cu 2.
4. Se combină metodele de la punctele 1 şi 2
5. 1100.01
6. 51.812510 ,63.528 , 33.A816
5. Trece numărul 12.25 din baza 10 în baza 2
6. Trece numărul binar 110011.10101 într-un număr în baza zece,
într-un număr în baza 8 şi într-un număr în baza 16

129
Algoritmi Complecşi

TTeessttuull ddee aauuttooeevvaalluuaarree 22

1. Numerele se scriu ca sume de puteri succesive ale bazei sistemului


cu coeficienţi – numere pozitive strict mai mici decât această bază.
2. Da. Cel puţin două.
3. Şirul lui Rolle – de exemplu. Între două rădăcini succesive ale
derivatei unei funcţii se poate afla o rădăcină a funcţiei.
4. Integrala definită este aria cuprinsă între graficul funcţiei şi axa Ox
delimitată de verticalele x = a, x = b
h
5. Soluţia se scrie sub forma y m +1 = y m + (k1 + 2 k 2 + 2 k 3 + k 4 )
6
k1 = f (x m , y m )

k = f  x + h , y + hk1 
2 m m
  2 2 
unde 
k = f  x + h , y + hk 2 
 3 
m
2
m
2 

k 4 = f (x m + h, y m + hk 3 )

7.11. Termeni şi expresii cheie. Formule cheie

Termeni şi expresii cheie

 Sistem de numeraţie; scriere poziţională


 Algoritmi de conversie
 Metoda înjumătăţirii intervalului
 Algoritmi de rezolvarea ecuaţiilor algebrice şi a
sistemelor lineare.
 Integrare numerică
 Metoda Runge Kutta
 Metoda Monte Carlo

130
Algoritmi Complecşi

Formule cheie
 Scrierea poziţională
N = d n −1 ⋅ r n −1 + d n − 2 ⋅ r n − 2 +  + d1 ⋅ r 1 + d0 ⋅ r 0 + d −1 ⋅ r −1 +  + d − m ⋅ r − m
 Formula rădăcinii aproximative iterate în metoda Newton
F (x n −1 )
x n = x n −1 −
F' (x n −1 )
 Integrarea numerică prin metoda trapezelor
 h
I ≈ ITrapeze = (y 0 + 2 y 1 + 2 y 2 +  + 2 y n −2 + y n −1 + y n )
 2
y i = f (a + ih )
 Integrare Runge Kutta de ordin 4
h
y m +1 = y m + (k1 + 2 k 2 + 2 k 3 + k 4 )
6
k1 = f (x m , y m )

k = f  x + h , y + hk1 
2 m m
  2 2 

k = f  x + h , y + hk 2 
 3 
m
2
m
2 

k 4 = f (x m + h, y m + hk 3 )

7.12. Lucrare de verificare


Rezolvă problema de mai jos. Trimite tutorelui răspunsurile pe care le
consideri corecte

1. Editează programul EX33.PAS (1 p)


2. Rulează programul folosind diferite valori pentru n
a. n=10 (2 p)
b. n=1000 (2 p)
c. n= 10000 (2 p)

3. Comentează rezultatul obţinut cunoscând valoarea analitică


exactă a integralei. (1 p)

4. Pune randomize în stare de comentariu. Rulează din nou


programul de câteva ori. Comentează. (1 p)

Notă: Se acordă un punct din oficiu


Total 10 puncte

131
Algoritmi Complecşi

7.13. Bibliografie

1. W.S.Dorn, D.D. Mc Crocken, Metode numerice cu programe în


Fortran, Editura Tehnică, p 13-49

132
Prelucrarea statistică a datelor experimentale

Unitatea de învăţare 8
PRELUCRAREA STATISTICĂ A DATELOR EXPERIMENTALE

Cuprins Pagina
8. PRELUCRAREA STATISTICĂ A DATELOR RXPERIMENTALE 133
8.1. Obiectivele Unităţii de învăţare 8
Prelucrarea statistică a datelor experimentale 134
8.2. Valoare medie, varianţă, abatere standard 134
8.3. Propagarea erorilor 137
8.4. Distribuţii 139
8.4.1. Distribuţia binomială 140
8.4.2. Distribuţia Poisson 141
8.4.3. Distribuţia Gauss 146
8.5. Metode de fit 149
8.5.1. Metoda celor mai mici pătrate pentru o dreaptă 149
8.5.2. Metoda celor mai mici pătrate pentru un polinom de grad 3 154
8.6. Test de autoevaluare 159
8.7. Răspunsuri la testul de autoevaluare 1 160
8.8. Termeni şi expresii cheie. Formule cheie 160
8.9. Lucrare de verificare 162
8.10. Bibliografie 162

133
Prelucrarea statistică a datelor experimentale

8.1. Obiectivele Unităţii de învăţare 8


Prelucrarea statistică a datelor experimentale

Când vei termina de studiat acest capitol vei fi capabil :

să foloseşti mărimile statistice care descriu rezultatele


experimentelor de fizică .

să foloseşti metode asistate de calculator pentru a prelucra


datele experimentale;

să alegi metoda adecvată de fitare a datelor experimentale


cu un model dat pentru a determina parametrii modelului

să aplici cunoştinţele dobândite pentru a interpreta statistic


rezultatele experimentelor de fizică.

8.2. Valoare medie, varianţă, abatere standard


Scopul acestei unităţi de învăţare este să te înveţe cum se pot obţine cele
mai bune rezultate din datele experimentale şi cum stabileşti precizia
acestor rezultate.

Adesea în procesul de măsurare a unei mărimi fizice se obţin valori


diferite la repetarea măsurării în aceleaşi condiţii fizice. Aceasta fie pentru
că mărimea fizică respectivă are un caracter statistic ( de exemplu
numărul de dezintegrări într-o secundă ale unui element radioactiv,
lungimea drumului între două ciocniri ale unui neutron în combustibilul
nuclear sau în mediul moderator într-un reactor nuclear, etc.)fie din cauza
preciziei limitate a aparaturii de măsură ( de exemplu erorile de calibrare
a ceasului, riglei, balanţei folosite la măsurarea intervalelor de timp, a
lungimilor sau a maselor).

În toate cazurile enumerate mai sus repetarea măsurărilor în aceleaşi


condiţii va conduce la rezultate diferite. Dacă aceste măsurări se fac de
un număr foarte mare de ori se constată că valorile pentru mărimea fizică
respectivă fluctuează în jurul unei valori medii. Dacă N este numărul de
repetări ale măsurării mărimii fizice în exact aceleaşi condiţii şi xi valoarea
obţinută într-una din măsurări valoarea medie x a şirului finit de N
măsurări va fi media aritmetică a valorilor xi

134
Prelucrarea statistică a datelor experimentale

1 N
x= ∑ xi
N i =1
( 8.1)

iar abaterea valorii xi de la x va fi ∆i dată de:


∆i = x i − x ( 8.2)
de unde rezultă că fiecare măsurare individuală se aşează în jurul valorii
medii
x i = x + ∆i ( 8.3)
Abaterile pot fi mai mari sau mai mici. O măsură a împrăştierii valorilor xi
faţă de valoarea medie x poate fi dată de ansamblul abaterilor sau de o
mărime care să descrie acest ansamblu. Această mărime nu poate fi o
abatere medie ∆ deoarece această mărime ar fi zero indiferent care sunt
valorile ∆i .

 ∆ =
1 N
∑ i N∑
N i =1
∆ =( )
1 N
x i − x =
1 N 
 ∑ xi  − x
 i =1  N i =1  ( 8.4)

∆ = x − x = 0
Abaterea pătratică medie, varianţa, este însă diferită de zero. Această
mărime este definită ca
 2
 σ x = ∆ 2
= ∑
N i =1
(
1 N 2 1 N
)
∆i = ∑ x i − x
N i =1
2


 ( 8.5)
σ = 
 x  N ∑
2  1
( N

i =1
2
) 2 


2
xi − 2 xi x + x  = x − x > 0
2

de unde şi
2
x2 > x ( 8.6)
adică media pătratelor este mai mare decât pătratul mediei unui şir de
valori.
Pentru caracterizarea împrăştierii se mai folosesc şi mărimile
σ x = ∆2 ( 8.7)
numită abatere standard şi abaterea standard relativă definită de:
∆2
εx = ( 8.8)
x
numită şi fluctuaţie.
Sumele se fac pe N valori ale probei măsurate. În general însă valoarea
medie nu este cunoscută; x este o estimare a ei şi de aceea
σ x2 =
1 N

N − 1 i =1
( )
xi − x
2
( 8.9)

Astfel o singură măsurare a mărimii nu ne permite să estimăm dispersia


valorilor, dacă valoarea ’adevărată’ nu este cunoscută.
Este important să reţii că σ este o măsură a dispersiei distribuţiei
măsurărilor şi nu a preciziei cu care este determinat x .

135
Prelucrarea statistică a datelor experimentale

σx
σx = ( 8.10)
N
Astfel crescând numărul de măsurări ale mărimii x, varianţa σ x2 nu se
schimbă (exceptând mici fluctuaţii) deoarece numitorul şi numărătorul
ecuaţiei (8.5) sau (8.9) cresc mai mult sau mai puţin proporţional, aceasta
întrucât σ x2 se presupune a fi o estimare a varianţei întregii populaţii care
este clar independentă de dimensiunea probei N. Pe de altă parte,
varianţa valorii medii σ x2 / N descreşte cu creşterea lui N; mai multe date
ajută la localizarea valorii medii cu o precizie mai înaltă.
Uneori măsurările sunt grupate astfel încât o aceeaşi valoare a xj apare
în mj evenimente. Atunci ecuaţiile (8.1) şi (8.9) se scriu

∑m x
j
j j

x= ( 8.11)
∑m j
j

şi

∑ m (x )
2
j j −x
j
σ x2 = ( 8.12)
 
 ∑ m j  −1
 
 j 
Varianţa asupra valorii medii este
σ x2
u2 = ( 8.13)
∑m j
j

Pentru distribuţii continue, valoarea medie şi varianţa sunt date respectiv


de formulele
1
x = ∫ n( x ) ⋅ x ⋅ dx ( 8.14)
N
1
N
2
σ x2 = ∫ n( x ) ⋅ x − x ⋅ dx ( ) ( 8.15)
unde
N = ∫ n( x )dx ( 8.16)
Factorul (N -1) din formula lui σ x2 s-a înlocuit cu N care se presupune a fi
foarte mare în acest caz.
Când câteva experienţe măsoară aceeaşi mărime fizică şi se obţine un
set de rezultate ai cu diferite erori σi , atunci cele mai bune estimări ale lui
a şi
a dispersiei σ sunt date de formulele:
ai
∑σ 2
a= i
( 8.17)
1
∑σ 2
i

136
Prelucrarea statistică a datelor experimentale

şi
1 1
=∑ ( 8.18)
σ 2
σ i2
Astfel rezultatul experimentului i urmează a fi ponderat cu un factor 1 / σ i2
. Într-un anume sens, 1 / σ i2 dă o măsură a informaţiei conţinute de acel
experiment particular.
Când diferitele experienţe de măsură realizează diferite precizii σi folosind
aceleaşi aparate dar repetând măsurarea de ni ori şi mediind, atunci
1
σi ≈ ( 8.19)
ni
şi formulele de mai sus devin
a = ∑ n i ai / ∑ n i
 ( 8.20)
N = ∑ n i
Prima din relaţiile de mai sus spune că fiecare din măsurările originale de
precizie egală este egal ponderată; a doua este evidentă.

8.3. Propagarea erorilor

Presupune o funcţie f(x, y) de două variabile independente. Fie f , x şi y


valorile medii ale funcţiei şi variabilelor. Prin repetarea măsurărilor se
obţin abaterile ∆i şi ∆j ale variabilelor x şi y ( i şi j iau toate valorile întregi
între 1 şi N, N fiind numărul de repetări ale măsurării). Pe baza ipotezei
că abaterile sunt mici faţă de mărimile respective, funcţia f (xi , yj ) se
poate dezvolta în serie Taylor în ordinul 1; forma pe care o obţii este
( )
f ( x i , y j ) = f + ∆ij f = f x + ∆i , y + ∆ j

( 8.21)

( ) ∂f
f ( x i , y j ) = f x , y + ∂x ∆i + ∂y ∆ j
∂f
 x ,y x ,y

Ai neglijat termenii de ordin mai înalt decât unu. Identificând:


( )
f = f x , y

 ∂f ∂f ( 8.22)
∆ij f = ∂x ∆i + ∂y ∆ j
 x ,y x ,y

Abaterea medie pătratică a funcţiei f este, prin definiţie


 2 1  ∂f ∂f 
2

σ f = (∆ij f ) = ∑∑  ∆i +
2
∆j 
 N i j  ∂x ∂y 

 2 1  ∂f 
2
 ∂f 
2

σ f =   ∑ (∆i ) +   ∑ (∆ j ) 
2 2
( 8.23)
 N 
  ∂ x  i  ∂y  j 

 2 2
 2  ∂f  2  ∂f  2
σ f =  ∂x  σ x +  ∂y  σ y
    
conform definiţiei (8.5) şi a faptului că suma produselor ∆i ∆j conţine
termeni ce se vor anula.

137
Prelucrarea statistică a datelor experimentale

Generalizând, pentru o funcţie f (x1, x2, ..., xm ) de m variabile xk


( k = 1, m ):
2
m
 ∂f  2
σ = ∑ 
f
2
 σ k ( 8.24)
k =1  ∂x x 

Relaţia de mai sus este cunoscută sub numele de teorema de


propagare a abaterilor standard sau, mai obişnuit, teorema de
propagare a erorilor.
Pentru a te obişnui cu tipul de calcule implicate în estimarea erorilor îţi
propunem să urmăreşti următoarea
Aplicaţie: se fac mai multe măsurări ale înălţimii de la care cade liber un
corp greu (h1, h2, ..., hn ) şi ale timpului de cădere (t1, t2, ..., tn ). Ne
propunem ca din datele experimentale să aflăm valoarea numerică a
acceleraţiei gravitaţionale.
Pentru aceasta, să presupunem că ai lăsat corpul să cadă liber de la
aceeaşi înălţime. Trebuie să calculezi valoarea medie pentru h, înălţimea
de aruncare, precum şi pentru timpul de cădere, t. Trebuie de asemenea
să determini abaterile standard ale celor două mărimi σ h şi σ i .
Din valorile medii vei putea calcula g şi aplicând teorema de propagare a
erorilor vei putea afla şi abaterea standard pentru g, σ g .

Programul prezentat în continuare, pe care îţi sugerăm să-l studiezi , să-l


editezi şi să-l rulezi, realizează calculele descrise mai sus calcul.
EX36.PAS
program prop_er;
type vec100=array[1..100] of real;
vec20=array[1..20] of real;
var xmediu,sigx2:vec20;
valx:vec100;
i,j,m,n:integer;
fmediu,sigfm2,sig1fm2,sig2fm2:real;
procedure med_abstd(x:vec100;n:integer;
Var xm,sigx2:real);
var sx:real; i:integer;
begin
sx:=0; for i:=1 to n do sx:=sx+x[i];
xm:=sx/n;
sx:=0; for i:=1 to n do sx:=sx+sqr(x[i]-xm);
sigx2:=sx/n;
end;
function f(h,t:real):real;
begin
f:=2*h/(t*t);
end;
function dfh(h,t:real):real;
begin
dfh:=f(h,t)/h;
end;

138
Prelucrarea statistică a datelor experimentale

function dft(h,t:real):real;
begin
dft:=-2*f(h,t)/t;
end;
begin
write(’ introdu nr. de variabile ’); readln(m);
write(’ introdu numarul de seturi de
masuratori,n=’); readln(n);
{n este numarul de masuratori asupra lui h si t} for
i:=1 to m do
{in cazul nostru m=2}
begin
writeln(’ introdu valorile x[’,i,’]’); {x[1] sunt
valorile h, aici}
for j:=1 to n do read(valx[j]); {x[2] sunt valorile t,
aici} med_abstd(valx,n,xmediu[i],sigx2[i]);
end;
fmediu:=f(xmediu[1],xmediu[2]); {fmediu este g aici}
sig1fm2:=sqr(dfh(xmediu[1],xmediu[2]));
sig2fm2:=SQR(dft(xmediu[1],xmediu[2]));
sigfm2:=sig1fm2*sigx2[1]+sig2fm2*sigx2[2]; writeln(’
h=’,xmediu[1]:10:2,’+/-’,SQRT(sigx2[1]):10:2);
writeln(’
t=’,xmediu[2]:10:2,’+/-’,SQRT(sigx2[2]):10:2);
writeln(’
g=’,fmediu:10:2,’+/-’,SQRT(sigfm2):10:2); readln;
readln;
end.

8.4. Distribuţii
în cadrul unei măsurări se încearcă obţinerea valorii ’adevărate’ a mărimii
fizice. Ceea ce obţii de obicei este valoarea medie care este o
aproximaţie a valorii adevărate cu atât mai bună cu cât numărul de
măsurări este mai mare. Dar valoarea pentru mărimea fizică măsurată
deşi nu este unică nu este totuşi liberă a fi oricare. Ea are o distribuţie
care de obicei poate fi aproximată cu o funcţie matematică simplă numită
funcţie densitate de probabilitate, p(x), sau funcţie de distribuţie.
Aceasta înseamnă că probabilitatea de a obţine o valoare x în intervalul
(x, x+dx) este dată de p(x)dx dacă variabila x variază continuu şi de p(xi )
pentru xi dacă x are valori discrete.
Funcţia de distribuţie satisface condiţia

∫ p( x )dx = 1
−∞
( 8.25)

pentru x continuu şi respectiv


N

∑ p( x
i =1
i ) =1 ( 8.26)

pentru x discret, N fiind numărul de valori posibile pentru xi

139
Prelucrarea statistică a datelor experimentale

Parametrii importanţi ce caracterizează o distribuţie sunt


valoarea medie definită de

µ = ∫ x ⋅ p( x ) ⋅ dx ( 8.27)
−∞
pentru o mărime care variază continuu şi respectiv
N
µ = ∑ x i ⋅ p( x i ) ( 8.28)
i =1
pentru o mărime cu variaţie discretă
abaterea pătratică medie (varianţa) definită de:
 2 ∞
σ = ∫ (x − µ ) ⋅ p( x ) ⋅ dx =< x > − µ
2 2 2

 −∞
 ∞
( 8.29)
< x 2 >= x 2 ⋅ p( x ) ⋅ dx



−∞

respectiv
N
σ 2 = ∑ (x i − µ )2 ⋅ p( x i ) ( 8.30)
i =1

8.4.1 Distribuţia binomială


Distribuţia binomială este prima funcţie de distribuţie care a fost enunţată
teoretic; Bernoulli a stabilit probabilitatea unei frecvenţe de apariţie în
cazul fenomenelor întâmplătoare. El a arătat că dacă p este
probabilitatea de apariţie a unui eveniment şi q = 1 - p este probabilitatea
ca acel eveniment să nu apară, atunci într-o serie de N probe
independente probabilitatea ca acel eveniment să apară de k ori este
N!
p k (1 − p )
N −k
P( k ) = ( 8.31)
k ! (N − k )!
k fiind variabila aleatoare. Se vede că probabilitatea P(k) are forma
termenului de ordin k+1 din dezvoltarea binomului lui Newton (p + q)N de
unde şi numele acestei distribuţii.
Distribuţia binomială este normată la unitate
N N
N!
∑ ∑ p k (1 − p ) = (p + q ) = 1
N −k N
P ( k ) = ( 8.32)
k =0 k =0 k ! (N − k )!
Distribuţia binomială este un caz particular al distribuţiei multinomiale.
în cazul distribuţiei binomiale la o singură probă sunt posibile numai două
evenimente ale căror probabilităţi sunt, respectiv, p şi q ( evident p + q =
1). În cazul distribuţiei multinomiale la o singură probă sunt posibile mai
multe evenimente; dacă probabilităţile acestor evenimente sunt p1, p2, ...,
ps atunci

p1 + p2 +  + ps = 1 ( 8.33)

Distribuţia binomială este distribuţia fundamentală care guvernează


fenomenele întâmplătoare. Celelalte funcţii de distribuţii se pot deduce
din aceasta.

140
Prelucrarea statistică a datelor experimentale

Distribuţia binomială are doi parametri independenţi: probabilitatea


simplă, p, şi numărul N de probe independente. Această distribuţie se
aplică riguros fenomenelor în care numărul total de probe N şi valoarea
aleatoare K pot lua numai valori întregi. Pentru acest motiv valorile k şi
k 2 se calculează prin sumare şi nu prin integrare.
 N N
(N − 1)! p k −1q N −k
 k = ∑ k ⋅ P ( k ) = Np ∑
k =0 k ! (N − k )! ( 8.34)
 k =0
k = Np(p + q )N −1 = Np

unde s-a ţinut seama că numărul combinărilor de N obiecte luate câte k,
C Nk este
N!
C Nk = ( 8.35)
k ! (N − k )!
şi că există relaţia
k ⋅ C Nk = N ⋅ C Nk −−11 ( 8.36)
La fel
 2 N N

 k = ∑ k 2
⋅ P ( k ) = ∑ [k (k − 1) + k ]P( k )
 k =0 k =0 ( 8.37)
 2
k = N (N − 1)p + Np = Np(1 − p ) + N p
2 2 2

şi
2
σ 2 = k 2 − k = Npq + N 2 p 2 − N 2 p 2 = Npq ( 8.38)
Valoarea aşteptată a lui k ( realizarea evenimentului de probabilitate p)
fiind k = Np putem estima p ca raportul k / N şi de asemeni o aproximaţie
a varianţei cu
N k k
s2 = N 1 −  ( 8.39)
N −1 N  N 
Din relaţiile (8.34) şi (8.38) se vede că σ 2 < k egalitatea realizându-se
doar pentru p=0. Astfel în general varianţa este mai mică decât valoarea
aşteptată. Aceasta deoarece N impune o limită superioară asupra lui k,
limită ce reduce dispersia distribuţiei în k. De exemplu dacă p=1 atunci
singura valoare diferită de zero a lui P este cea pentru k = N ( avem doar
reuşite) şi deci σ = 0. Dacă p este foarte mic, limita superioară impusă de
N nu e importantă şi σ 2 ≈ k Similar pentru p aproape egal cu 1,
constrângerea asupra numărului de nereuşite nu este importantă şi
varianţa în numărul de nereuşite (care evident este egală cu varianţa
numărului de reuşite ) este aproximativ egală cu numărul de nereuşite.
Distribuţia binomială are o formă greoaie pentru aplicaţii în fizica nucleară
din cauza factorialelor care sunt greu de calculat în cazul numerelor mari.
Din această cauză experienţa a impus găsirea altor funcţii de distribuţie
mai comode diferitelor aplicaţii.
 p → 0 , N → ∞, dar Np = m ( cons tan t ) ( 8.40)
distribuţia binomială trece în distribuţie Poisson
 N → ∞, p = cons tan t ( 8.41)
distribuţia binomială trece în distribuţie Gauss.

141
Prelucrarea statistică a datelor experimentale

8.4.2. Distribuţia Poisson

Distribuţia Poisson descrie apariţia evenimentelor rare, adică a


evenimentelor a căror probabilitate de apariţie este foarte mică şi
constantă. Această distribuţie este foarte importantă pentru măsurările de
radiaţii unde se înregistrează dezintegrări puţine faţă de numărul foarte
mare al nucleelor prezente.
Distribuţia Poisson se obţine din distribuţia binomială când
p → 0 , N → ∞, Np = m ( 8.42)
Dacă introduci p = m / N în expresia distribuţiei binomiale vei obţine
 N! m 
k
m
N −k

 P ( k ) =    1 − 
 k ! (N − k )!  N   N
 ( 8.43)
N (N − 1) (N − k + 1)  m  
k N −k
 m
P ( k ) =   1 − 
 k! N   N
Dacă N este foarte mare atunci
N (N − 1) (N − k + 1)
lim
N →∞ Nk
=1 ( 8.44)

şi
N −k N
 m  m
lim 1 − 
N →∞  N
= lim 1 −  = e −m
N →∞  N
( 8.45)

astfel că forma distribuţiei Poisson este:


m k −m
p( k ) = e ( 8.46)
k!
unde k este - de exemplu - valoarea obţinută pentru numărul de
dezintegrări înregistrate în intervale egale de timp iar m este valoarea
medie dată de:
k max

∑n k i i
m= i =0
k max
( 8.47)
∑n
i =0
i

în care ni este frecvenţa cu care s-a obţinut valoarea ki .


k max
N= ∑n
i =0
i ( 8.48)

este numărul total de măsurări.

Ar trebui să reţii câteva dintre proprietăţile principale ale distribuţiei


Poisson
1. este normată la unitate; deoarece

mk

k = 0 k!
= em ( 8.49)

rezultă

∑ p(k ) = 1
k =0
( 8.50)

142
Prelucrarea statistică a datelor experimentale

2. valoarea sa medie este m.


 ∞ ∞
mk −m


k = ∑
k =0
kp ( k ) = ∑ k! e
k =0
k
 ( 8.51)
k = m

m k −1 − m
 ∑
k = 0 (k − 1)!
e =m

3. abaterea standard este m


 2 ∞ ∞



k = ∑
k =0
k 2
p ( k ) = ∑ [k (k − 1) + k ]p(k )
k =0
 ( 8.52)
k 2 = m 2

mk −2 −m ∞
m k −1 − m
 ∑
k = 0 (k − 2 )!
e + m ∑
k = 0 (k − 1)!
e = m2 + m

rezultă că (vezi şi relaţiile 8.5)


2
σk = k2 − k = m ( 8.53)
4. probabilitatea de a obţine zero evenimente (de exemplu număr de
dezintegrări zero) este diferită de zero şi cu atât mai mare cu cât valoarea
medie, m, a variabilei k este mai mică.
5.deoarece variabila k ia doar valori întregi, reprezentarea grafică a
funcţiei p(k) este o histogramă. Distribuţia este mai asimetrică pentru m
mai mic ;în plus
p(m − 1) = p(m ) ( 8.54)
dacă m este întreg:
6. distribuţia Poisson are un singur parametru independent. Acesta este
valoarea medie m. Cu

pk (t ) =
(µ ⋅ t )k e − µ ⋅t = (m )k e − m ( 8.55)
k! k!
probabilitatea de a observa k evenimente independente într-un interval
de timp t când viteza de numărare este µ şi numărul aşteptat de

evenimente în intervalul de timp este m, valoarea medie a variabilei k ce


are o distribuţie Poisson este m şi σ2 = m. Aceasta este baza cunoscutei
formule
n± n ( 8.56)
formulă care se aplică erorilor statistice în multe situaţii ce implică
numărarea unor evenimente independente într-un interval de timp fixat.
Când m → ∞ distribuţia Poisson tinde la o distribuţie Gauss; pentru ca
această aproximaţie să fie valabilă rezonabil se găseşte că 5 sau mai
mult este o aproximaţie suficient de bună pentru considerarea lui m ca
infinit. Aceasta este foarte util deoarece multe calcule statistice sunt mult
mai simplu de realizat dacă erorile sunt distribuite Gauss.
Un exemplu de variabilă care este distribuită Poisson este numărul de
particule detectat de un contor într-un interval de timp t în situaţiile când
sursa radioactivă este o sursă slabă ca intensitate.
Următorul program calculează, plecând de la un şir de valori măsurate
pentru frecvenţa de apariţie a unui număr k de pulsuri în detector,
mărimea m şi distribuţia frecvenţelor teoretice,ν i = N ⋅ p(k i ) şi reprezintă
grafic histograma.

143
Prelucrarea statistică a datelor experimentale

Observă forma histogramei pentru diferite valori nk. Pentru aceasta


rulează programul activând alt set de valori nk prin ştergerea acoladelor
de la setul respectiv.
Atenţie: doar un set nk trebuie să fie activ într-o rulare a programului. Vei
verifica în acest fel proprietăţile 4 şi 5 ale distribuţiei Poisson şi faptul că
ea tinde la o distribuţie Gauss pentru de îndată ce k = 5

EX37.PAS
program distr_Poisson;
uses graph;
type vector=array[0..10] of integer;
const k:vector=(0,1,2,3,4,5,6,7,8,9,10);
nk:vector=(5,10,30,60,76,85,72,50,30,15,4);
{ nk:vector=(35,70,98,100,70,40,30,20,10,5,2);}
{ nk:vector=(70, 90, 50, 30, 10, 5, 0, 2,0,0,0);}
{ nk:vector=(48,90,90,50,30,10,5,2,1,0,1);}
label unu, doi, trei;
var nkmax, kmax, snk,sknk:integer;
cx:array[0..10] of string[2];
kmediu, sigk, scy, sknk1:real;
niuk:vector;
i, scx, gd, gm, ix, iy1, iy2:integer;
g:char;
begin
sknk:=0; snk:=0; kmax:=10;
for i:=0 to kmax do
begin
sknk:=sknk+nk[i]*k[i]; snk:=snk+nk[i];
end;
kmediu:=1.*sknk/snk;sknk1:=0;
writeln(’kmediu=’,kmediu:6:2);
for i:=0 to kmax do sknk1:=sknk1+sqr(k[i]-
kmediu)*nk[i]; sigk:=sqrt(1.*sknk1/snk);
niuk[0]:=round(snk*exp(-kmediu));
for i:=1 to kmax do niuk[i]:=round(niuk[i-
1]*kmediu/i);
writeln(’k n(k) niu(k) ’);
writeln;
for i:=0 to kmax do writeln(k[i]:7,nk[i]:7,
niuk[i]:7);
trei: write(’ doriti histograma? (d/n)’);
readln(g); if upcase(g)=’N’ then goto unu;
if upcase(g)=’D’ then goto doi;
goto trei;
doi: nkmax:=nk[0]; if nkmax<niuk[0] then
nkmax:=niuk[0];
for i:=1 to kmax do
begin
if nkmax<nk[i] then nkmax:=nk[i];
if nkmax<niuk[i] then nkmax:=niuk[i];
end;

144
Prelucrarea statistică a datelor experimentale

scx:=50;scy:=300./nkmax;gd:=detect;
initgraph(gd,gm,’\tp\bgi’);
setlinestyle(0,0,1);line(10,330,10+scx*(kmax+1),330);
line(10,330,10,330-round(scy*nk[0]));moveto(10,330-
round(scy*nk[0]));
linerel(scx,0); for i:=1 to kmax do
begin
ix:=10+i*scx; iy1:=330-round(scy*nk[i-1]);
iy2:=330-round(scy*nk[i]);
line(ix,iy1,ix,iy2);
moveto(ix,iy2);linerel(scx,0);
end;

moveto((kmax+1)*scx+10,iy2);lineto((max+1)*scx+10,330)
; setlinestyle(1,0,1);line(10,330,10,330-
round(scy*niuk[0])); moveto(10,330-
round(scy*niuk[0]));linerel(scx,0);
for i:=1 to kmax do
begin
ix:=10+i*scx; iy1:=330-round(scy*niuk[i-1]);
iy2:=330-round(scy*niuk[i]);
line(ix,iy1,ix,iy2);
moveto(ix,iy2);linerel(scx,0);
end;

moveto((kmax+1)*scx+10,iy2);lineto((kmax+1)*scx+10,330
);
for i:=0 to kmax do
begin
str(i,cx[i]); outtextxy(35+i*scx, 335,cx[i]);
end;
repeat until keypressed; closegraph;

unu:end.

Figura 8.1
Distribuţii Gauss cu µ = 1 şi diferite σ

145
Prelucrarea statistică a datelor experimentale

8.4.3. Distribuţia Gauss

Distribuţia normală sau distribuţia Gauss este distribuţia cea mai des
folosită în prelucrarea datelor experimentale. Forma sa este
( x − µ )2
1 − 2
p( x ) = e 2σ ( 8.57)
σ 2π
Aşa cum vezi, forma sa este determinată de doi parametri independenţi,
µ şi σ. Reţine câteva dintre proprietăţile distribuţiei Gauss

1. este normată la unitate


∫ p( x )dx = 1
−∞
( 8.58)

(reaminteşte-ţi o proprietate importantă a integralei Euler - că


∫e
−u 2
du = π )
−∞

2. este simetrică faţă de dreapta x = µ în sensul că are valori egale pentru


puncte egal depărtate de µ.
p(x1) = p(x2) ( 8.59)
dacă
|µ − x1| = |x2 − µ| ( 8.60)

3. admite un singur maxim, pentru


x = µ

 1 ( 8.61)
 p( µ ) = σ 2π

4.prin integrare numerică se poate verifica faptul că probabilitatea ca o


valoare măsurată,x, să aparţină intervalului (µ − σ , µ + σ ) este
µ +σ
r (µ − σ ≤ x ≤ µ + σ ) = ∫ p( x )dx = 0.693 ( 8.62)
µ σ

analog pentru intervalele de 2σ şi 3σ,


µ + 2σ
r (µ − 2σ ≤ x ≤ µ + 2σ ) = ∫ p( x )dx = 0.954 ( 8.63)
µ − 2σ
µ + 3σ
r (µ − 3σ ≤ x ≤ µ + 3σ ) = ∫ p( x )dx = 0.9973 ( 8.64)
µ σ
−3

Aşa cum vezi, pentru o mărime, ale cărei valori sunt distribuite Gauss,
valoarea ei apare cu o probabilitate de:
• 69,3 % în intervalul (µ−σ, µ+σ)
• 95,4 % în intervalul (µ−2σ, µ+2σ)
• 99,7 % în intervalul (µ−3σ, µ+3σ)
Înţelegi că vei greşi foarte puţin ( cu mai puţin de 0,3%) dacă „arunci”
valorile ce nu aparţin intervalului (µ−3σ, µ+3σ).

146
Prelucrarea statistică a datelor experimentale

Programul EX38.PAS calculează, pentru un set de valori distribuite


Gauss, valorile de mai sus folosind pentru integrare funcţia simpson
care a apărut prima dată în EX31.PAS - aflată acum în fişierul
simpson.inc

EX38.PAS

program distr_Gauss;
uses graph;
type fct=function(x:real):real;
const pi=3.14159; n=51;
xm:array[1..10]of real
=(11.,12.,13.,14.,15.,13.,12.,14.,13.,13);
var x,y:array[1..100] of real;
s,xmediu,sigx,xmin,xmax,dx,xscal,yscal:real;
r:array[1..3] of real;
i:byte;
gd,gm,nxx,nyy:integer;
nx,ny:array[1..100] of integer;
maxx,maxy:integer;
{$F+}
function gauss(x:real):real;
begin
gauss:=EXP(-sqr(x-xmediu)/2/sigx/sigx);
end; {end Gauss}

{$F-}
{$i simpson.inc}
BEGIN
s:=0;for i:=1 to 10 do s:=s+xm[i]; xmediu:=s/10;

writeln(’xmediu=’,xmediu);
s:=0; for i:=1 to 10 do s:=s+sqr(xm[i]-xmediu);
sigx:=sqrt(s/10);
writeln(’sigx=’,sigx); readln;
for i:=1 to 3 do
begin
xmin:=xmediu-i*sigx;
xmax:=xmediu+i*sigx;
r[i]:=simpson(xmin,xmax,20,gauss)/sigx/sqrt(2*pi);
writeln(’probabilitatea ca o valoare x sa cada’);
writeln(’in intervalul xmediu-’,i,’*sigx -
xmediu+’,i,’*sigx=’,r[i]);
end;
readln;
writeln(’ urmeaza reprezentarea grafica a
distr. Gauss a valorilor x’);
readln;
dx:=6*sigx/51;
xscal:=n/sigx/2;
yscal:=300*sigx*sqrt(2*pi);
writeln(’xscal=’,xscal,’ yscal=’,yscal);

147
Prelucrarea statistică a datelor experimentale

for i:=1 to n do
begin
x[i]:=xmediu-(n div 2+1-i)*dx;
y[i]:=gauss(x[i])/sigx/sqrt(2*pi);
nx[i]:=trunc(x[i]*xscal+0.5);nxx:=nx[i];
ny[i]:=trunc(y[i]*yscal+0.5);nyy:=ny[i];
end;
readln;
gd:=detect;
InitGraph(gd,gm,’c:\tp\bgi’);setbkcolor(1);
line(10,400,600,400);{axa X} outtextxy(600,400,’x’);
line(10,0,10,400);{axa Y} outtextxy(0,10,’y’);
setlinestyle(userbitln,$aa,normwidth);setcolor(14);
line(nx[27],400,nx[27],0);{axa ce marcheaza xmediu}
outtextxy(nx[27]-20,410,’xmediu’);
line(10,400-trunc(ny[26]*0.5),600,400-
trunc(ny[26]*0.5));
{axa ce marcheaza dispersia }
for i:=1 to n do outtextxy(nx[i],400-ny[i],’+’);
readln; end.
Fişierul simpson.inc conţine:
function simpson(a, b:real; n:integer; f:fct):real;
var s, h:real;
i:integer;
begin
h:=(b-a)/n/2; s:=f(a)+f(b);
i:=1;
while i < 2*n do begin
if i mod 2 = 0 then s:=s + 2*f(a+i*h)
else s:=s+4*f(a+i*h);
i:=i+1 end;
simpson:=s*h/3;
end; {end simpson}

Distribuţia Gauss are largi aplicaţii în teoria erorilor. Proprietăţile


distribuţiei Gauss sunt de regulă folosite la interpretarea semnificaţiei
unor rezultate experimentale. Folosirea lor în acest context se leagă de
următoarele presupuneri:
• Valoarea mărimii de interes a fost calculată corect ( adică nu există erori
sistematice (biases) importante.
• Mărimea erorilor a fost corect calculată. Aceasta este deosebit de
important deoarece o estimare incorectă a preciziei unui experiment ar
putea avea un efect foarte mare asupra semnificaţiei rezultatului pe care
îl calculezi şi deci asupra concluziilor pe care le tragi. Astfel, o
subestimare a erorilor experimentului pe care îl analizezi cu un factor 2
poate schimba efectul unei deviaţii standard de 2 ( care apare la nivel de
5%) într-unul de deviaţie standard 4 ( a cărui probabilitate este de doar
610−5 adică un astfel de efect ” nu poate ” să se întâmple dacă teoria
este corectă.
• Forma rezoluţiei experimentale este astfel încât aproximaţia Gauss este
rezonabilă. Aceasta este aproape întotdeauna neadevărat, prin aceea că
probabilitatea de a obţine deviaţii mai mari (≥ 3σ) de la valoarea corectă

148
Prelucrarea statistică a datelor experimentale

este adesea mai mare decât cea dată de distribuţia Gauss. Acest efect
este de asemeni probabil să rezulte din creşterea artificială a estimării
asupra semnificaţiei deviaţiilor observate.

8.5. Metode de fit

Când vrei să testezi modul în care o teorie explică datele experimentale


pe care le analizezi, trebuie să recurgi la aşa numitele metode de fit
 pentru a vedea în ce măsură datele experimentale „se potrivesc” cu
formula teoretică presupusă (testul χ 2 ) fie
 pentru a determina valorile parametrilor liberi care determină
„potrivirea” formulei teoretice presupuse corecte cu datele
experimentale (metoda celor mai mici pătrate).

8.5.1. Metoda celor mai mici pătrate pentru o dreaptă

Presupune că măsori în punctele x[1]..x[n] valorile unei mărimi fizice y


despre care ştii că depinde liniar de x ( y = a*x + b ) şi că ai obţinut
valorile y[1]..y[n]. Din cauza erorilor (σi ) în măsurarea lui y punctele nu se
aşează perfect pe o dreaptă. Cum trasezi totuşi dreapta printre punctele
experimentale şi cum obţii parametrii ei?
Dacă suma ponderată a pătratelor distanţelor de la punctele
experimentale la o anumită dreaptă este cea mai mică cu putinţă, se
poate spune că din motive statistice această dreaptă descrie cel mai bine
, se potriveşte cel mai bine, fitează, datele experimentale. Dacă dreapta
căutată are forma y = a ⋅ x + b , matematic, condiţia de mai sus se scrie

S=∑
n
(y i − a ⋅ xi − b )2 = minim ( 8.65)
i =1 σ i2
Pentru găsirea minimului expresiei, trebuie determinate punctele critice,
în care derivatele parţiale se anulează, adică, succesiv

∂S
=0 ( 8.66)
∂a
din care rezultă
n
x2 n
x n
x ⋅y
a∑ i2 + b∑ i2 − ∑ i 2 i = 0 ( 8.67)
i =1 σi i =1 σi i =1 σi
şi
∂S
=0 ( 8.68)
∂b
din care rezultă
n
x n
1 n
y
a ∑ i2 + b∑ 2 − ∑ 2i = 0 ( 8.69)
i =1 σi i =1 σi i =1 σi
Ansamblul relaţiilor(8.67)(8.69) formează un sistem de 2 ecuaţii cu 2
necunoscute, a şi b. Notând
1
= pi ( 8.70)
σi2

149
Prelucrarea statistică a datelor experimentale

ponderea unei măsurări, sistemul se scrie:


 n n n

 ∑ i i ∑ ∑
2
a p ⋅ x + b p i ⋅ x i = p i ⋅x i ⋅ y i
 i =1 i =1 i =1
 n n n
( 8.71)
a p ⋅x + b p =
 ∑ ∑ ∑
i i i p i ⋅y i
i =1 i =1 i =1

cu soluţiile
  n   n   n   n 
  ∑ p i  ⋅  ∑ p i ⋅x i ⋅ y i  −  ∑ p i ⋅xi  ⋅  ∑ p i ⋅y i 
a =  i =1   i =1   i =1   i =1 
2
  n
  n
  n

  ∑ p i  ⋅  ∑ p i ⋅xi2  −  ∑ p i ⋅xi 
  i =1   i =1   i =1 
 ( 8.72)
  n
  n
  n
  n

 ∑ p i ⋅xi2  ⋅  ∑ p i ⋅y i  −  ∑ p i ⋅xi  ⋅  ∑ p i ⋅xi ⋅ y i 
   i =1   i =1   i =1 
b = 
i =1
2
  n
  n
  n

  ∑ p i  ⋅  ∑ p i ⋅xi2  −  ∑ p i ⋅xi 
  i =1   i =1   i =1 
Dacă
σ1 = σ2 = ... = σn = σy ( 8.73)
atunci
p1 = p2 = ... = pn ( 8.74)
şi expresiile pentru a şi b devin cele întâlnite adesea în fitul cu o dreaptă
prin metoda celor mai mici pătrate

  n   n   n 
 n ⋅  ∑ i i  −  ∑ xi  ⋅  ∑ y i 
 x ⋅ y
a =  i =1   i =1   i =1 
2
  n
2  n 
 n ⋅  ∑ xi  −  ∑ xi 
  i =1   i =1 
 ( 8.75)
  n 2  n   n   n 
 ∑ xi  ⋅  ∑ y i  −  ∑ xi  ⋅  ∑ xi ⋅ y i 
  i =1   i =1   i =1   i =1 
b = 2
  n
  n

 n ⋅  ∑ xi2  −  ∑ xi 
  i =1   i =1 
Pentru a găsi erorile cu care sunt determinaţi parametrii a şi b ai dreptei
poţi aplica teorema de propagare a erorilor (8.24)
  ∂a 
2
 ∂a 
2

a = a( x, y ) ⇒ σ a =   ⋅ σ x +   ⋅ σ y2
2 2

  ∂x   ∂y 
 2
( 8.76)
2
  ∂b   ∂b 
b = b( x, y ) ⇒ σ b =  ∂x  ⋅ σ x +  ∂y  ⋅ σ y
2 2 2

    
Cum am presupus că erori se fac doar în y rezultă că σx = 0 şi deci

150
Prelucrarea statistică a datelor experimentale

 n
 ∂a 
2

σ a = ∑ 
2
 ⋅ σ y2
 i =1  ∂y i 
 2
( 8.77)
 2 n
 ∂b 
σ b = ∑  ∂y  ⋅ σ y
2

 i =1  i 

cu
σ y1 = σ y 2 =  = σ y n = σ y ( 8.78)
Cum
2
  n  
2  n ⋅ xi −  ∑ xi  
 ∂a   i =1  
  =  ( 8.79)
  n  
2
 ∂y i   n
2
 n ⋅  ∑ xi  −  ∑ xi  
  i =1   i =1  
rezultă
n
σa = 2
⋅σ y ( 8.80)
 n 2  n 
n ⋅  ∑ xi  −  ∑ xi 
 i =1   i =1 
La fel, din
2
  n 2  n  
2   ∑ xi  − xi  ∑ xi  
 ∂b   i =1  
  =   i =1  ( 8.81)
  n   n  
2
 ∂y i   n ⋅  ∑ xi2  −  ∑ xi  
  i =1   i =1  
rezultă
n

∑x 2
i
σb = i =1
2
⋅σ y ( 8.82)
 2
n
 n 
n ⋅  ∑ x i  −  ∑ x i 
 i =1   i =1 
În EX39.PAS se află un program de fit pentru o dreaptă.
Datele luate din ((([6] tabelul 7.2))) se referă la înălţimea (în metri) şi
greutatea
(în kilograme) a 9 oameni cu vârstă cuprinsă între 25 şi 29 de ani. Se
presupune o eroare în aprecierea greutăţii de 1 Kg. Toate aceste date se
află în fişierul datehg.in

EX39.PAS

program fit_dreapta; { metoda celor mai mici patrate}


uses graph;
label unu,doi,trei,patru;
var x,y,z:array[1..100] of real;
sx,sy,sxy,sx2,sigy,num,a,b,siga,sigb,ymax:real;
h, scx, scy:real;
i,n,gd,gm,px,py,sigpy:integer;
g:char; f:text;
begin

151
Prelucrarea statistică a datelor experimentale

assign(f,’datehg.in’); reset(f);
readln(f,n); for i:=1 to n do readln(f,x[i],y[i]);
readln(f,sigy);
sx:=0;sy:=0;sxy:=0;sx2:=0;{initializare pentru sume}
for i:=1 to n do
begin
sx:=sx+x[i]; sy:=sy+y[i]; sxy:=sxy+x[i]*y[i];
sx2:=sx2+x[i]*x[i];
end;
num:=n*sx2-sx*sx;{calcul numitor si verificare cu
0}
if num=0 then goto unu;
{calcul paramatrii dreptei}
a:=(n*sxy-sx*sy)/num; b:=(sx2*sy-sx*sxy)/num;
siga:=sqrt(n/num)*sigy; sigb:=sqrt(sx2/num)*sigy;
for i:=1 to n do z[i]:=a*x[i]+b; {punctele de pe
dreapta}
writeln(’ i ’,’ x ’,’ y ’,’ y=a*x+b ’);
{ scrie rezultate}
for i:=1 to n do
writeln(i:3,x[i]:10:2,y[i]:10:2,z[i]:10:2);
writeln(’ parametrii dreptei y=a*x+b sunt:’);
writeln(’a=’,a:8:2,’+/-’,siga:8:2);
writeln(’b=’,b:8:2,’+/-’,sigb:8:2);
writeln(’ doriti greutatea cea mai probabila ’);
writeln(’ pentru o anumita inaltime?
(d/n)’); readln(g);
if upcase(g)=’N’ then goto trei else
begin

write(’ introdu h in metri= ’); readln(h);


writeln(’greutatea la h=’,h:10:2,’ este ’,
a*h+b:10:2);

end;
trei: write(’ doriti reprezentare grafica?(d/n)’);
readln(g);if upcase(g)=’N’ then goto doi;
if upcase(g)=’D’ then goto patru else goto
trei;
{rerprezentare grafica a dreptei si
punctelor experimentale}
patru: ymax:=y[1]; if ymax<z[1] then ymax:=z[1];
for i:=2 to n do
begin
if ymax<y[i] then ymax:=y[i];
if ymax<z[i] then ymax:=z[i];
end;
ymax:=ymax+10;
scx:=400./x[n]; scy:=300./ymax; {factori de scalare}
gd:=detect; InitGraph(gd,gm,’c:\tp\BGI’);
setbkcolor(15); setcolor(1);

152
Prelucrarea statistică a datelor experimentale

line(10,10,10,410); line(10,400,600,400);{axele X si
Y}
for i:=1 to n do
begin
px:=trunc(scx*x[i]+0.5);
py:=400-trunc(scy*y[i]+0.5);
sigpy:=trunc(scy*sigy+0.5); setcolor(3);
circle(px,py,trunc(sigpy*0.7*scy));
putpixel(px,py,4);
end;
setcolor(2);
line(0,400-trunc(scy*b),trunc(scx*3.+0.5),
400-trunc(scy*(a*3.+b)+0.5));
outtextxy(20,10,’Y’);outtextxy(600,400,’X’);
line(trunc(1.*scx),390,trunc(1.*scx),410);
outtextxy(trunc(1.*scx),415,’100cm’);
line(trunc(2.*scx),390,trunc(2.*scx),410);
outtextxy(trunc(2.*scx),415,’200cm’);
py:=trunc(scy*(a*1.+b)+0.5);
line(0,400-py,20,400-py);outtextxy(20,400-py,’33.51’);
py:=trunc(scy*(a*2.+b)+0.5);line(0,400-py,20,400-py);
outtextxy(20,400-py,’85.42’);
readln; closegraph; goto doi;
unu: writeln( ’ calcul imposibil’);
doi:end.

Figura 8.2

153
Prelucrarea statistică a datelor experimentale

Reprezentarea grafică a datelor din fişierul datehg.in fitate cu o


dreaptă

Fişierul ’datehg.in’ are conţinutul prezentat în tabelul din figura 8.3

9
1.57 61.24
1.63 63.50
1.63 71.21
1.68 69.85
1.73 68.95
1.78 73.03
1.83 78.93
1.88 81.65
1.93 78.93

Figura 8.1

Rezultatul grafic al rulării programului EX39.PAS se vede în figura 8.2.

8.5.2. Metoda celor mai mici pătrate pentru un polinom de grad 3


Dacă punctele experimentale se aşteaptă să descrie un polinom de grad 3
y = a0 + a1x + a2 x 2 + a3 x 3 ( 8.83)
atunci plecând tot de la condiţia:
( )
n
S = ∑ y i − a0 − a1x − a2 x 2 − a3 x 3
2
= minim ( 8.84)
i =1
se obţine următorul sistem de 4 ecuaţii cu 4 necunoscute (a0, a1, a2 şi a3)
din anularea derivatelor parţiale
 ∂S ∂S
 ∂a = 0 ; ∂a = 0
 0 1
 ( 8.85)
 ∂S = 0 ; ∂S = 0
 ∂a2 ∂a3

 n n n n

 a 0 ⋅ N + a 1 ∑ x i + a 2 ∑ x 2
i + a 3 ∑ x 3
i = ∑ yi
 i =1 i =1 i =1 i =1

 n n n n n

 0 ∑ i 1∑ i 2∑ i 3∑ i ∑
2 3 4
a ⋅ x + a x + a x +a x = xi ⋅ y i
 i =1 i =1 i =1 i =1 i =1
 n n n n n
( 8.86)
a ⋅ x 2 + a
 0 ∑ 1 ∑ x i +a2 ∑ x i +a3 ∑ x i = ∑ x i ⋅ y i
3 4 5 2
i
i =1 i =1 i =1 i =1 i =1
 n n n n n
a ⋅ x 3 + a
 0 ∑ 1∑ i 2∑ i 3∑ i ∑
4 5 6
i x +a x + a x = x i3 ⋅ y i
i =1 i =1 i =1 i =1 i =1

Sistemul de ecuaţii algebrice lineare se rezolvă prin metoda Gauss-


Jordan, metodă prin care sistemul se reduce la o formă în care
coeficienţii sub diagonala principală sunt zero.

154
Prelucrarea statistică a datelor experimentale

Procedura
gaussj(var a:glnpbynp; n,np:integer; var b:glnpbymp;
m,mp:integer)
din [7] cere ca programul principal ce o foloseşte să definească tipurile:
type glnpbynp=array[1..np,1..np] of real;
glnpbymp=array[1..np,1..mp] of real;
glnp=array[1..np] of integer;
a este matricea coeficienţilor şi are dimensiunea npXnp
n este numărul de ecuaţii ale sistemului, n < np
b este matricea termenilor liberi, de dimensiune npXmp atunci când cu
aceeaşi matrice a se rezolvă mai multe (m) sisteme de ecuaţii ce diferă
prin termenii liberi (în cazul nostru matricea b are o singură coloană).
PROCEDURE gaussj(VAR a: glnpbynp; n,np: integer;
VAR b: glnpbymp; m,mp: integer);
VAR
big,dum,pivinv: real;
i,icol,irow,j,k,l,ll: integer;
indxc,indxr,ipiv: glnp;
BEGIN
FOR j := 1 to n DO BEGIN ipiv[j] := 0 END;
FOR i := 1 to n DO BEGIN
big := 0.0; FOR j := 1 to n DO BEGIN
IF (ipiv[j] <> 1) THEN BEGIN
FOR k := 1 to n DO BEGIN
IF (ipiv[k] = 0) THEN BEGIN
IF (abs(a[j,k]) >= big) THEN BEGIN
big := abs(a[j,k]); irow := j; icol := k
END
END ELSE IF (ipiv[k] > 1) THEN BEGIN
writeln(’pause 1 in GAUSSJ - singular matrix’);
readln
END
END
END
END;
ipiv[icol] := ipiv[icol]+1;
IF (irow <> icol) THEN BEGIN
FOR l := 1 to n DO BEGIN
dum := a[irow,l]; a[irow,l] := a[icol,l];
a[icol,l] := dum
END;
FOR l := 1 to m DO BEGIN
dum := b[irow,l]; b[irow,l] := b[icol,l];
b[icol,l] := dum
END
END;
indxr[i] := irow; indxc[i] := icol;
IF (a[icol,icol] = 0.0) THEN BEGIN
writeln(’pause 2 in GAUSSJ - singular matrix’);
readln
END;
pivinv := 1.0/a[icol,icol]; a[icol,icol] := 1.0;

155
Prelucrarea statistică a datelor experimentale

FOR l := 1 to n DO BEGIN
a[icol,l] := a[icol,l]*pivinv
END;
FOR l := 1 to m DO BEGIN
b[icol,l] := b[icol,l]*pivinv
END;
FOR ll := 1 to n DO BEGIN
IF (ll <> icol) THEN BEGIN
dum := a[ll,icol]; a[ll,icol] := 0.0;
FOR l := 1 to n DO BEGIN
a[ll,l] := a[ll,l]-a[icol,l]*dum
END;
FOR l := 1 to m DO BEGIN
b[ll,l] := b[ll,l]-b[icol,l]*dum
END
END
END
END;
FOR l := n DOWNTO 1 DO BEGIN
IF (indxr[l] <> indxc[l]) THEN BEGIN
FOR k := 1 to n DO BEGIN
dum := a[k,indxr[l]];
a[k,indxr[l]] := a[k,indxc[l]];
a[k,indxc[l]] := dum
END
END
END
END;

Fişierul se salvează în directorul curent ca gaussj.inc


Iată în continuare o aplicaţie de fit cu polinom de grad trei.
Datele experimentale, aflate în fişierul tip text, ’polinom3.dat’,
reprezintă dependenţa căldurii specifice masice a apei de temperatură.
Datele folosite sunt cele prezentate în tabelul din figura 8.4 şi sunt luate
din[6] (tabelul 7.4)

Fişierul ’polinom3.dat’:

21
0. 1.00762 5. 1.00392 10. 1.00153 15. 1.00000 20. 0.99907
25. 0.99852 30. 0.99826 35. 0.99818 40. 0.99828 45. 0.99849
50. 0.99878 55. 0.99919 60. 0.99967 65. 1.00024 70. 1.00091
75. 1.00167 80. 1.00253 85. 1.00351 90. 1.00461 95. 1.00586
100. 1.00721

Figura 8.2

156
Prelucrarea statistică a datelor experimentale

Iată şi programul de calcul care realizează fitul propus

EX40.PAS
program mcmp_polinom;
uses graph;
const np=10; mp=10;
type glnpbynp=array[1..np,1..np] of real;
glnpbymp=array[1..np,1..mp] of real;
glnp=array[1..np] of integer;
var x, y, yt:array[1..30] of real;
a:glnpbynp; b:glnpbymp;
i, j, n:byte; gd, gm:integer;
px, py, pyt:integer;
scx, scy, ymin, ymax:real;
sx6, sx5, sx4, sx3, sx2, sx, sx3y, sx2y, sxy,
sy:real;
a0, a1, a2, a3:real;
f:text; numef:string;
BEGIN
write(’introdu nume fisier cu date de \intrare:’);
readln(numef);
assign(f,numef); reset(f); readln(f,n);
for i:=1 to n do read(f,x[i],y[i]); close(f);
sx6:=0;sx5:=0;sx4:=0;sx3:=0;sx2:=0;
sx:=0;sx3y:=0;sx2y:=0;sxy:=0;sy:=0;
for i:=1 to n do
begin
sx6:=sx6+sqr(x[i])*sqr(x[i])*sqr(x[i]);
sx5:=sx5+ sqr(x[i])*sqr(x[i])*x[i];
sx4:=sx4+sqr(x[i])*sqr(x[i]);
sx3:=sx3+sqr(x[i])*x[i];
sx2:=sx2+sqr(x[i]);
sx:=sx+x[i]; sx3y:=sx3y+sqr(x[i])*x[i]*y[i];
sx2y:=sx2y+sqr(x[i])*y[i]; sxy:=sxy+x[i]*y[i];
sy:=sy+y[i];
end;
a[1,1]:=n; a[1,2]:=sx; a[1,3]:=sx2; a[1,4]:=sx3;
b[1,1]:=sy;
a[2,1]:=sx; a[2,2]:=sx2; a[2,3]:=sx3; a[2,4]:=sx4;
b[2,1]:=sxy;
a[3,1]:=sx2; a[3,2]:=sx3; a[3,3]:=sx4; a[3,4]:=sx5;
b[3,1]:=sx2y;
a[4,1]:=sx3; a[4,2]:=sx4; a[4,3]:=sx5; a[4,4]:=sx6;
b[4,1]:=sx3y;
writeln(’matricea a este:’); for i:=1 to 4 do
begin
for j:=1 to 4 do
write(a[i, j]:17:1);
writeln;
end;
readln; writeln(’matricea b este:’);
for i:=1 to 4 do writeln(b[i,1]:15:5); readln;

157
Prelucrarea statistică a datelor experimentale

gaussj(a,4,np,b,1,mp);
writeln(’parametrii polinomului
y=a0+a1*x+a2*x^2+a3*x^3 sunt:’);
a0:=b[1,1]; a1:=b[2,1];
a2:=b[3,1]; a3:=b[4,1];
writeln(’a0=’,a0,’ a1=’,a1);
writeln(’a2=’,a2,’ a3=’,a3); readln;
writeln(’ i x y yt’);
for i:=1 to n do
yt[i]:=a0+a1*x[i]+a2*x[i]*x[i]+a3*sqr(x[i])*x[i];
for i:=1 to n do writeln(i:3, x[i]:10:1, y[i]:10:5,
yt[i]:10:5);
ymin:=1.E30; ymax:=-1.E30;
for i:=1 to n do
begin
if ymin > y[i] then ymin:=y[i];
if ymin > yt[i] then ymin:=yt[i];
if ymax < y[i] then ymax:=y[i];
if ymax < yt[i] then ymax:=yt[i];
end;
writeln(’ymin=’, ymin, ’ ymax=’, ymax); READLN;
scy:=300/(ymax-ymin); scx:=6.;
gd:=detect;InitGraph(gd,gm,’\tp\bgi’);
setcolor(3);
for i:=1 to n do
begin
px:=trunc(scx*x[i]+0.5);
py:=400+trunc(scy*ymin+0.5)-trunc(scy*y[i]+0.5);
pyt:=400+trunc(scy*ymin+0.5)-trunc(scy*yt[i]+0.5);
circle(px+5, py, 2); putpixel(px+5, pyt, 2);
end;
readln; pyt:=400+trunc(scy*ymin+0.5)-trunc(scy+0.5);
line(trunc(scx*x[1])+5, pyt, trunc(scx*x[n])+5, pyt);
{axaX}
outtextxy(trunc(scx*x[n])+10,pyt,’X’);line(trunc(scx*x
[1])+5,
pyt,trunc(scx*x[1])+5, 400-pyt); {axa Y}
outtextxy(trunc(x[1]*scx)+5,400-pyt-10,’Y’);
px:=trunc(scx*(x[n]-x[1]));
line(px,pyt-10,px,pyt+10);outtextxy(px,pyt+20,’1.’);
px:=trunc(scx*((x[n]-x[1])/2));
line(px+10,pyt-
10,px+10,pyt+10);outtextxy(px,pyt+20,’0.5’);
px:=trunc(scx*x[1])+5;
line(px,pyt-10,px,pyt+10);outtextxy(px,pyt+20,’0.’);
outtextxy(px-5,pyt-5,’1. ’); readln; closegraph;
END.

158
Prelucrarea statistică a datelor experimentale

Figura 8.5
fitul datelor cp (T ) cu un polinom de grad 3

Figura 8.5 arată cât de bine sunt fitate datele cu un polinom de grad 3.
Cercurile albe reprezintă datele experimentale, iar punctele sunt valorile
rezultate din fitul datelor cu un polinom de grad 3

8.6. Test de autoevaluare

1.Calculează media punctelor realizate atunci când arunci de foarte


multe ori un zar.

2.Calculează dispersia punctajelor obţinute în experimentul de mai


sus

3.Scrie expresia matematică a legii de propagare a erorilor .

4.Calculează probabilitatea ca aruncând de 5 ori un zar să obţii de


două ori 6

5.Scrie expresia pantei dreptei de fit pentru o dependenţă lineară

Răspunsurile le
găseşti la pagina 160

159
Prelucrarea statistică a datelor experimentale

8.7. Răspunsuri la testul de autoevaluare 1

1
1. m = (1 + 2 + 3 + 4 + 5 + 6) = 21 .
6 6
2. 315 / 108

2
 ∂f
m
 2
3. σ = ∑ 
f
2
 σ k
k =1  ∂x x 

4. Numărul cerut este coeficientul lui x2 în dezvoltarea


5 3
1 5 2 5 1250
 x +  adică C 5 5 = 5
6 6 6 6

 n   n   n   n 
 ∑ p i  ⋅  ∑ p i ⋅x i ⋅ y i  −  ∑ p i ⋅x i  ⋅  ∑ p i ⋅y i 
5. a = 
i =1   i =1   i =1   i =1 
2
 n
  n
  n

 ∑ p i  ⋅  ∑ p i ⋅x i2  −  ∑ p i ⋅x i 
 i =1   i =1   i =1 

8.8. Termeni şi expresii cheie. Formule cheie

Termeni şi expresii cheie

 Valoare medie, varianţă, abatere standard


 Funcţie de distribuţie
 Metoda celor mai mici pătrate
 Algoritmi pentru prelucrare statistică a datelor

160
Prelucrarea statistică a datelor experimentale

Formule cheie
1 N
 Formula de calcul a mediei x = ∑ xi
N i =1
 Formula de calcul a abaterii pătratice medii
 2
σ
 x = ∆ 2
=
1 N 2 1 N

N i =1
∆i = ∑ x i − x
N i =1
( 2
)


σ 2 =  1
 x ∑
N

 N i =1
( 2 
)
2
x i2 − 2 x i x + x  = x 2 − x > 0

 Distribuţia binomială
N!
p k (1 − p )
N −k
P( k ) =
k ! (N − k )!
m k −m
 Distribuţia Poisson p( k ) = e
k!
 Distribuţia Gauss
( x − µ )2
1 − 2
p( x ) = e 2σ
σ 2π
 Dreapta de fit
  n   n   n 
 n ⋅  ∑ i i  −  ∑ xi  ⋅  ∑ y i 
 x ⋅ y
a =  i =1   i =1   i =1 
2
  n
2  n 
 n ⋅  ∑ xi  −  ∑ xi 
  i =1   i =1 

  n
2 
n
  n   n 
 ∑ xi  ⋅  ∑ y i  −  ∑ xi  ⋅  ∑ xi ⋅ y i 
  i =1   i =1   i =1   i =1 
b = 2
  n 2  n 
 n ⋅  ∑ xi  −  ∑ xi 
  i =1   i =1 

161
Prelucrarea statistică a datelor experimentale

8.9. Lucrare de verificare

Alege una dintre lucrările de laborator pe care ai studiat-o deja în cursul


semestrului la o disciplină experimentală.
Scrie un program care să facă analiza statistică a datelor.

1. Tabelează câteva zeci de perechi de date măsurate de tine.


(2pt)

2. Scrie programul pe care intenţionezi să-l foloseşti. (2pt)

3. Rulează programul propus. (3 pt)

4. Asigură-te că programul tău comandă imprimarea unui tabel de


rezultate. Trimite tutorelui acest tabel împreună cu listingul
programului. (2 pt)

Notă: Se acordă un punct din oficiu


Total 10 puncte

8.10. Bibliografie

1.Numerical Recipes – The art of Scientific Computing. W.H.Press,


Cambridge Press.

162
Simularea unui experiment de fizică

Unitatea de învăţare 9
SIMULAREA UNUI EXPERIMENT DE FIZICĂ

Cuprins Pagina

9. SIMULAREA UNUI EXPERIMENT DE FIZICĂ 163

9.1. Obiectivele Unităţii de învăţare 9


Simularea unui experiment de fizică 164

9.2. Experimentul Rutherford 164

9.2.1. Tratarea împrăştierii particulelor α prin formalismul Lagrange 168

9.3. Lucrare de verificare 178

Bibliografie 179

163
Simularea unui experiment de fizică

9.1. Obiectivele Unităţii de învăţare 9


Simularea unui experiment de fizică

Când vei termina de studiat acest capitol vei fi capabi :

să faci legătura dintre un fenomen fizic şi simularea lui;

să scrii algoritmi care să permită construirea de programe


pentru simulare

să foloseşti capacităţile calculatorului pentru a propune


modele operante pentru fenomene fizice

să aplici cunoştinţele dobândite pentru a studia fenomene


fizice complexe prin simulare .

Această ultimă unitate de învăţare a cursului are scopul de a ilustra


posibilitatea simulării asistate de calculator a unor fenomene fizice
complexe.

9.2. Experimentul Rutherford

În 1910 cei mai mulţi fizicieni ajunseseră să creadă că atomii sunt formaţi
din sarcini electrice pozitive şi negative şi că forţele de atracţie şi repulsie
dintre aceste sarcini electrice sunt responsabile de toate fenomenele
fizice şi chimice în solide, lichide, gaze. Deoarece se ştia că electronii
sunt prezenţi în toate aceste forme ale materiei, părea rezonabil a
presupune că fiecare atom constă dintr-o combinaţie de sarcini pozitive şi
negative. Mişcările de vibraţie ale electronilor într-un astfel de atom ar fi
explicat emisia undelor electromagnetice şi, deci, emisia luminii de către
atom. Totuşi atât aranjarea sarcinilor electrice în atom cât şi mecanismul
care să explice caracteristicile de culoare ale luminii emise au rămas un
mister până când E.Rutherford a descoperit nucleul atomic şi Niels Bohr
a dat cuantificarea stărilor atomice. Un atom constă dintr-un număr de
electroni, să zicem Z electroni, dispuşi într-un nor de sarcini pozitive.
Norul este greu având aproape întreaga masă a atomului. Sarcina
pozitivă în nor este +Ze astfel că ea neutralizează sarcina negativă - Ze,
a celor Z electroni. Intr-un atom neperturbat electronii se află
în poziţiile lor de echilibru unde atracţia norului asupra electronilor este
anulată de repulsia lor reciprocă. Dar dacă electronii sunt perturbaţi, să
zicem prin ciocnire, atunci ei vor avea o mişcare de oscilaţie în jurul

164
Simularea unui experiment de fizică

poziţiilor lor de echilibru şi vor emite lumină. Acest model al atomului,


numit ”modelul budincii cu stafide” dădea frecvenţe ale vibraţiilor de
acelaşi ordin de mărime cu frecvenţele luminii dar nu reproducea seriile
spectrale observate.
Rutherford stabileşte că cea mai mare parte a masei atomului este
concentrată într-o zonă mult mai mică, nucleul, aflat în centrul atomului.
Rutherford a studiat emisia particulelor α din substanţele radioactive. De
exemplu poloniu emite spontan particule α cu energii de ordinul MeV care
trec uşor prin folii de metal sau sticlă sau alte materiale. Rutherford a fost
impresionat de puterea de pătrundere a acestor particule α şi s-a gândit
că le poate folosi pentru a sonda ” interiorul ” atomului.
Când un fascicol de particule α loveşte o foiţă de metal, ele pătrund în
atomi şi sunt deviate prin ciocnirile cu structurile subatomice. De
exemplu, dacă interiorul unui atom are structura ” budincii cu stafide ”
propusă de J.J.Thomson, atunci particulele α vor suferi doar deviaţii
foarte mici deoarece nici electronii, cu masele lor foarte mici, nici norul
difuz de sarcină pozitivă nu vor fi în stare să perturbe mişcarea unei
particule α masive şi cu energie de câţiva MeV.

Experienţa crucială care a stabilit distribuţia spaţială a electronilor şi a sarcinii


pozitive din atom a fost realizată de H.Geiger şi E.Marsden lucrând sub îndrumarea
lui Rutherford.

În experiment s-au folosit folii subţiri de Au şi Ag ca ţinte care au fost


bombardate cu fascicule de particule α de la o sursă radioactivă. După ce
particulele α treceau prin folii, ele erau detectate pe un ecran de ZnS care
înregistra impactul fiecărei particule printr-o scintilaţie slabă. Spre uimirea
lui Rutherford unele particule α erau deviate la unghiuri aşa de mari că
veneau înapoi. Rutherford a intuit imediat că deviaţiile mari trebuie să fie
produse de o ciocnire între particula α şi un nucleu masiv dar de
dimensiuni mici în interiorul atomului. Prin urmare a propus modelul
atomic în care atomul e format dintr-un nucleu mic de sarcină +Ze
conţinând aproape întreaga masă a atomului; acest nucleu este
înconjurat de o mulţime de Z electroni. Astfel atomul este asemeni
sistemului solar, nucleul jucând rolul soarelui şi electronii rolul planetelor.

Sir Ernest Rutherford 1871 - 1937, fizician englez, profesor la McGill şi la


Manchester, director al laboratorului Cavendish la Cambridge ( succesor al lui
J.J.Thomson) este considerat fondatorul fizicii nucleare datorită descoperirii
nucleului atomic şi a transmutaţiei elementelor prin dezintegrare radioactivă.
Laureat al Premiului Nobel pentru chimie în 1908

Într-o ciocnire centrală conservarea energiei totale dă distanţa minimă de


apropiere. În figura de mai jos cele două drumuri – cel de apropiere şi cel
de îndepărtare - sunt desenate distinct deşi pentru ciocnire centrală
aceste drumuri sunt suprapuse.

165
Simularea unui experiment de fizică

Figura 9.1

Mv 2 Z Z e2
Ecin = = 1 2 ( 9.1)
2 4πε 0rmin
cu e 2 / 4πε 0 = 1.44MeV ⋅ fm , E α = 6.4MeV , Z 1 = 2, Z 2 = 79 se obţine
rmin = 35,5fm adică o distanţă de ≈ 3.610−14 m sau ≈ 1/106 din
dimensiunea atomului.

Pe baza acestui model al atomului Rutherford a calculat distribuţia


unghiulară a particulelor α funcţie de parametrul de ciocnire b (adică
distanţa la care ar trece particula α faţă de nucleu dacă nu ar fi deviată).
Deoarece energia cinetică a particulei α este mică comparativ cu energia
ei de masă, tratamentul aplicat problemei este unul de mecanică clasică.
Se poate trata probleme în formalismul Lagrange. în care vei lua în
considerare două grade de libertate: distanţa între centrele celor două
nuclee ( particula α şi nucleul ţintă) şi unghiul polar θ faţă de direcţia
incidentă (Fig. 9.2).

Din conservarea energiei totale


µ ⋅ v 2 µ  2 2 2
E=
2 2
( )
= ⋅ r + r ⋅ θ + U (r ) ( 9.2)
poţi scoate derivata în raport cu timpul a lui r
dr 2
= ⋅ (E − U (r )) − r 2θ 2 ( 9.3)
dt µ
Din conservarea momentului cinetic orbital
µ ⋅ v ⋅ b = µ ⋅ r 2 ⋅ θ = L ⋅  ( 9.4)
poţi scoate derivata în raport cu timpul a lui θ.
dθ L⋅
= ( 9.5)
dt µ ⋅r2
Dacă elimini timpul între relaţiile de mai sus găseşti

−1
dθ L  2  L2 2  
= 2  E − U −  ( 9.6)
dr µr  µ  2µr 2  
 

166
Simularea unui experiment de fizică

Figura 9.2

Traiectoria unei particule alpha în câmpul nucleului de Au cu ilustrarea


coordonatelor r şi θ

Cu schimbarea de variabilă w = b/r , dw = −b dr/r 2 obţii funcţia de


deflecţie
b
rmin
dw
Θ(r ) = π − 2 ∫ ≤π ( 9.7)
0 1− U / E − w 2
Pentru
Z1Z2e 2
U (r ) = ( 9.8)
4πε 0r
vei obţine unghiul θ de împrăştiere a particulei α legat de parametrul de
ciocnire şi de energia cinetică prin relaţia
θ  Z Z e
2
tg   = 1 2 ( 9.9)
2 2Eb
Secţiunea geometrică de interacţiune este
σ = πb 2

 dσ db ( 9.10)
 = 2πb
 dθ dθ
şi
2
dσ  Z1Z2e 2  1
=   ( 9.11)
dΩ  2E  4 sin4 θ
2
bine cunoscuta formulă Rutherford pentru descrierea distribuţiei
unghiulare a particulelor α împrăştiate pe Au sau Ag.

167
Simularea unui experiment de fizică

9.2.1. Tratarea împrăştierii particulelor α prin formalismul Lagrange

Pentru studiul împrăştierii particulelor α pe nuclee de Au sau Ag ai putea


folosi formalismul clasic Lagrange ( lungimea de undă de Broglie asociată
sistemului este mică în comparaţie cu dimensiunea sa
1  c
λ= = = ≈ 0.74fm ( 9.12)
k 2µE 2µEc 2
cu

c = 197.32 MeV ⋅ fm
 2
mc = 931.5MeV ( 9.13)
 AA
µc 2 = 1 2 mc 2
 A1 + A2
şi
( )
R = r0 A11/ 3 + A21/ 3 ≈ 7.1r0 ( 9.14)
(cu r0 variind între 0.9 şi 1.5 fm )

În sistemul centrului de masă funcţia Lagrange, în coordonatele r şi θ


este
µ  2 2 2
L= (r + r θ ) − U (r )
2
( 9.15)
unde
µ = (A1A2 / (A1 + A2 ))mc 2 ( 9.16)
este masa redusă a sistemului particulă α – nucleu atomic de aur sau
particulă α – nucleu atomic de argint.
Când sarcina ce creează câmpul electric în care se mişcă particula α este
o sarcină punctiformă
Z Z e2
U (r ) = VCoulomb (r ) = 1 2 ( 9.17)
4πε 0r
Ecuaţiile de mişcare Lagrange sunt, în forma generală
d  ∂L  ∂L
 − =0 ( 9.18)
dt  ∂qi  ∂q i
unde qi reprezintă coordonatele generalizate – corespunzătoare
numărului gradelor de libertate de interes - în cazul de care ne ocupăm r
şi θ.
Se obţin 4 ecuaţii diferenţiale de ordinul întâi: Soluţiile acestui sistem de
ecuaţii diferenţiale de ordinul întâi sunt calculate numeric folosind metode
Runge - Kutta de ordin 4. Pentru rezolvare ai nevoie de condiţiile iniţiale;
în rezolvarea numerică vei urmări anumite etape . Astfel

• vei considera că momentul iniţial t=0 este unul la care particula α se


află la o distanţă suficient de mare de nucleul de Au sau Ag ( în listing-ul
programului constanta x la t0=80 fm), distanţă la care se consideră că
energia de interacţiune Coulomb este mult mai mică decât energia
mişcării relative a celor două nuclee şi prin urmare poate fi neglijată.

168
Simularea unui experiment de fizică

• în programul al cărui listing este prezentat mai jos, se calculează r0 ca


funcţie de parametrul de ciocnire: pentru opţiunea t (studiul traiectoriilor
doar) se generează 10 valori pe care le considerăm ilustrative, pentru
opţiunea s (studiul secţiunii Rutherford ) se generează aleator 100 valori
ale parametrului de ciocnire b uniform distribuit în cercul de rază 3 ∗ bmax
unde bmax = 3*rrint iar rint este raza de interacţiunee calculată după formula
rint = 1.5 A21/ 3
r0 = b 2 + xlat 02 ( 9.19)
• se calculează θ0 din relaţia
π − θ 0 = arctg (b / xlat 0 ) ( 9.20)
• se calculează viteza iniţială v0 a particulei incidente din energia iniţială a
acesteia
µv 02
=E ( 9.21)
2
• se calculează θ0 din conservarea momentului cinetic orbital
L = µv 0b = µr02θ0

  v 0b ( 9.22)
θ 0 = r 2
 0

Prin opţiuni la rularea programului poţi solicita diferite tipuri de rezultate


finale:

• fie traiectoriile - prin programul trcoul din fişierul ex41.pas (studiază


listingul prezentat în continuare) daca alegi opţiunea t
• fie secţiunile eficace – prin rularea programului trcoul din fişierul
ex41.pas cu opţiunea s; cerculeţele albe dau rezultatele în formă grafică
astfel că se pot compara cu secţiunea obţinută din integrarea ecuaţiilor
de mişcare.

În secvenţa care urmează este prezentat listing-ul programului din fişierul

EX41.PAS

EX41.PAS Program trCoul;


uses graph;
{ traiectorii Coulomb ale particulei alpha in
câmpul nucleelor ţintă de masa A2 si sarcina Z2}
{pentru vizualizare traiectorii se genereaza 10
traiectorii si se apeleaza procedura grafica}
{ pentru sectiuni se genereaza Monte Carlo 100
valori pentru parametrul de ciocnire uniform
distribuit pe
suprafata cercului de raza=bmax fm,
b=sqrt(2*r)*bmax fm. r este un numar aleator
uniform distribuit
pe intervalul [0,1). Se deseneaza cu puncte
dsigma/domega
pentru unghiurile rezultate din integrarea ecuatiilor
de miscare;

169
Simularea unui experiment de fizică

cu cerculete se deseneaza dsigma/domega functie de


1/sin^4(theta/2) pentru valori echidistante ale lui
theta;
procedura graficas }

type glnarray=array[1..4] of real {cerut de rk4};


label 25, 30, unu, doi, trei, patru, 35, 40;
const n=4;t0=0.; tf=1.; dt=5.E-03;
pi=3.14159; amu=931.478; clum=2.99793E+03;
hc=197.32; p13=0.333333; e2c2=129.6E+05;e2=1.44;
xlat0=80.; a1=4; z1=2;
var rint, cp, cm, cz, c1, c2, v0, cb, cw:real;
cs, cs2, bmax, dmin:real;
y, dydx:glnarray;
st:array[1..20]of string;
stdim,a2c,z2c,elabc:string;
bcioc,tetaf:array[1..100]of real;
xt,yt:array[1..250] of real;
xtg, ytg:array[1..20,1..250] of integer;
xsigtg, ysigtg:array[1..100] of integer;
xsigt, ysigt:array[1..100]of real;
xtmax, ytmax, xtmin, ytmin:real;
xscal, yscal, arg, dsigmax, dsigmin :real;
dsig:array[1..100] of real;
nmax,ndim, nparc, l, i, j:word;
clum2, a2, z2, ared, elab, ecm, vinit, moml:real;
r0, z0, z0g, w0, r, x:real;
tetat, dsigt:array[1..20] of real;
xsigtt,ysigtt:array[1..20] of integer;
ia:char;
{$F+}
procedure derivs(x:real; y:glnarray; var
dydx:glnarray);
{ceruta de rk4}
begin dydx[1]:=y[2]*y[3]*y[3]+cz/y[2]/y[2];
dydx[2]:=y[1];
dydx[3]:=-2*y[1]*y[3]/y[2];
dydx[4]:=y[3];
end; {end derivs}
{$F-}
function putere(baza,exponent:real):real;
begin
putere:=EXP(exponent*LN(baza));
end; {end putere}
procedure grafica;
var i:word; gd, gm:integer;
xc, yc:integer;
begin gd:=detect; Initgraph(gd,gm,’c:\tp\bgi’);
xc:=400; yc:=400;
{coordonatele centrului sistemului de referinta}
setbkcolor(15); setcolor(1);
moveto(0,yc);lineto(600,yc);

170
Simularea unui experiment de fizică

outtextxy(610,yc,’X’);
setfillstyle(1,1);

fillellipse(xc,yc,trunc(rint+0.5),trunc(rint+0.5));
outtextxy(xc-10,yc+10,’A2=’+a2c);
outtextxy(xc-10,yc+30,’Z2=’+z2c);
outtextxy(10,50,’miscarea particulei alpha in
campul Coulomb al nucleului Z2, A2’);

outtextxy(10,70,’energia’+elabc+’MeV’);
outtextxy (500,330,’dmin=’+stdim+’fm’);
outtextxy(470,30,’unghiul de deviatie’);

for i:=1 to nparc do


begin
for j:=1 to nmax-1 do
putpixel(xc+xtg[i,j],400-ytg[i,j],1);
outtextxy(530,10+i*30,st[i]);
end;
end; {end grafica}
procedure graficas;
var i:word; gd, gm:integer;
xc, yc:integer;
begin
gd:=detect; Initgraph(gd,gm,’c:\tp\bgi’);
xc:=5; yc:=400;
{coordonatelecentruluisistemului de referinta}
setbkcolor(15); setcolor(1);
moveto(0,yc); lineto(600,yc);
outtextxy(600,yc-10,’theta’);{axa X}
outtextxy(xc,yc+10,’0’);
outtextxy(10,50,’miscarea particulei alpha in
campul Coulomb al
nucleului Z2= ’+z2c);
outtextxy(10,70,’energia’+elabc+’ MeV’);
moveto(trunc(xscal*pi)+xc,410);
lineto(trunc(xscal*pi)+xc,390);
outtextxy(trunc(xscal*pi)+xc,410,’pi’);
moveto(trunc(xscal*pi/2)+xc,410);
lineto(trunc(xscal*pi/2)+xc,390);
outtextxy(trunc(xscal*pi/2)+xc,410,’pi/2’);
moveto(xc,0); lineto(xc,400);
outtextxy(xc,10,’dsig/domega’);
for i:=1 to nparc do putpixel(xc+xsigtg[i],400-
ysigtg[i],1);
{distr. rezultata din generarea lui b}
for j:=1 to 18 do circle(xc+xsigtt[j],400-
ysigtt[j],2);
{distr. teoretica}
end; {end graficas}

171
Simularea unui experiment de fizică

{$i rk4.inc}
BEGIN
clum2:=clum*clum;
{ marimi ce caracterizeaza sist.de ioni grei}
write( ’a si z pentru tinta: ’); readln( a2, z2);
str(a2:5:1,a2c);str(z2:5:1,z2c);
write(’elab=’); readln( elab );
{calcul constante ce depind de sistemul de ioni
grei}
ared:=a1*a2/(a1+a2)*amu;
cm:=clum2/ared;
rint:=1.5*putere(a2,p13);
cz:=z1*z2*e2c2/ared;
cb:=hc/ared/sqrt(2*elab/a1/amu);
cw:=hc*clum/ared; ecm:=a2/(a1+a2)*elab;
cs:=z1*z2*e2/2./ecm;
cs2:=cs*cs; vinit:=clum*sqrt(2*elab/a1/amu);
writeln(’ a2=’,a2:5:1,’ z2=’,z2:5:1);
writeln(’ elab=’,elab:10:2,’ ecm=’,ecm:10:2,
ared=’,ared:10:2 ,’ rint=’,rint:10:2);
ndim:=trunc((tf-t0)/dt); writeln(’ndim=’,ndim:5);
dmin:=z1*z2*e2/2/ecm;
str(dmin:6:2,stdim); str(elab:6:1,elabc);

{nparc=10 pentru traiectorii, nparc=100 pentru


sectiune}

write(’ pentru traiectorii tastati t, pentru sectiune


tastati s:’);
readln(ia);
if upcase(ia)=’T’ then goto unu;
if upcase(ia)=’S’ then goto doi;

unu: nparc:=10;
for i:=1 to nparc do
begin
if i<= 3 then bcioc[i]:=2*i else bcioc[i]:=3*i;
l:=trunc(bcioc[i]/cb);
moml:=sqrt(l*(l+1));
r0:=sqrt(bcioc[i]*bcioc[i]+xlat0*xlat0);
z0:=pi-Arctan(bcioc[i]/xlat0);
z0g:=z0*180/pi; w0:=moml*cw/r0/r0;
x:=t0; y[1]:=-vinit; y[2]:=r0; y[3]:=-w0; y[4]:=z0;

for j:=1 to ndim do


begin
derivs(x,y,dydx);
rk4(y,dydx,4,x,dt,y);
x:=x+dt;
xt[j]:=y[2]*cos(y[4]);
yt[j]:=y[2]*sin(y[4]);

172
Simularea unui experiment de fizică

if abs(y[2]) > 100 then goto 25


end;
nmax:=j-1;
25: nmax:=j;
30: if xt[nmax] < xt[nmax-1] then
tetaf[i]:=pi-arctan((yt[nmax]-yt[nmax-1])/
(xt[nmax-1]-xt[nmax]))
else tetaf[i]:=arctan((yt[nmax]-yt[nmax-1])/
(xt[nmax]-xt[nmax-1]));
tetaf[i]:=tetaf[i]*180./pi;
str(tetaf[i]:10:2,st[i]);

xtmax:=xt[2]; xtmin:=xt[2]; ytmax:=yt[2];


ytmin:=yt[2];

for j:=1 to nmax do


begin
if xtmax < xt[j] then xtmax:=xt[j];
if xtmin > xt[j] then xtmin:=xt[j];
if ytmax < yt[j] then ytmax:=yt[j];
if ytmin > yt[j] then ytmin:=yt[j];
end;

{factorii de scalare pentru grafica}


xscal:=600./(xtmax-xtmin); yscal:=400./(ytmax-ytmin);

for j:=1 to nmax do


begin
xt[j]:=xscal*xt[j]; yt[j]:=yscal*yt[j];
end;

for j:=1 to nmax do


begin
xtg[i,j]:=trunc(xt[j]+0.5);
ytg[i,j]:=trunc(yt[j]+0.5);
end;
end;{end pe ciclul dupa i de la 1 la nparc}

grafica; readln; closegraph;

writeln(’ doriti sectiuni? d/n’); read(ia);


if upcase(ia)=’N’ then goto trei
else goto doi;

{se genereaza aleator 100 parametri de ciocnire}


{functia de distributie este p(b)db=
2bdb/bmax/bmax,
s-a luat bmax=3*rint}

doi: nparc:=100; randomize; bmax:=3*rint;


for i:=1 to nparc do
begin

173
Simularea unui experiment de fizică

patru: r:=random(100)/100.;
bcioc[i]:=sqrt(2*r)*bmax;
if bcioc[i]<0.5 then goto patru;
l:=trunc(bcioc[i]/cb); moml:=sqrt(l*(l+1));
r0:=sqrt(bcioc[i]*bcioc[i]+xlat0*xlat0);

z0:=pi-Arctan(bcioc[i]/xlat0); z0g:=z0*180/pi;
w0:=moml*cw/r0/r0; x:=t0;
y[1]:=-vinit; y[2]:=r0; y[3]:=-w0; y[4]:=z0;
for j:=1 to ndim do
begin
derivs(x,y,dydx);
rk4(y,dydx,4,x,dt,y);
x:=x+dt;
xt[j]:=y[2]*cos(y[4]); yt[j]:=y[2]*sin(y[4]);
if abs(y[2]) > 100 then goto 35
end;
nmax:=j-1;goto 40;
35: nmax:=j;
40: if xt[nmax] < xt[nmax-1] then
tetaf[i]:=pi-arctan((yt[nmax]-yt[nmax-1])/
(xt[nmax-1]-xt[nmax]))
else tetaf[i]:=arctan((yt[nmax]-yt[nmax-1])/
(xt[nmax]-xt[nmax-1]));
end; {inchide ciclul dupa i de la 1 la nparc}

for i:=1 to nparc do


begin
arg:=tetaf[i]/2.;
dsig[i]:=cs2/sin(arg)/sin(arg)/sin(arg)/sin(arg);
end;

dsigmax:=dsig[1]; dsigmin:=dsig[1];

for i:=2 to nparc do


begin
if dsig[i] > dsigmax then dsigmax:=dsig[i];
if dsig[i] < dsigmin then dsigmin:=dsig[i];
end;
yscal:=400./(dsigmax-dsigmin); xscal:=600./3.14159;

for j:=1 to nparc do


begin
xsigt[j]:=xscal*tetaf[j]; ysigt[j]:=yscal*dsig[j];
end;
for j:=1 to nparc do
begin
xsigtg[j]:=trunc(xsigt[j]);
ysigtg[j]:=trunc(ysigt[j]);
end;

174
Simularea unui experiment de fizică

for j:=1 to 18 do
begin
tetat[j]:=j*10*pi/180;arg:=tetat[j]/2.;
dsigt[j]:=cs2/sin(arg)/sin(arg)/sin(arg)/sin(arg)*ysca
;
tetat[j]:=xscal*tetat[j]; xsigtt[j]:=trunc(tetat[j]);
ysigtt[j]:=trunc(dsigt[j]);
end;
graficas; readln; readln;closegraph;
trei:end.

Fişierul rk4.inc conţine subrutina de integrare a ecuaţiilor diferenţiale


de ordin 1 (uită-te din nou în unitatea de învăţare 7)

Figura 9.3

traiectoriile particulei alpha în campul nucleului de Ag;


energia incidenta 10MeV

175
Simularea unui experiment de fizică

Figura 9.4

traiectoriile particulei alpha în câmpul Coulomb al nucleului de


Ag, energia incidenta 5 MeV;observă valoarea lui dmin

Figura 9.5

traiectoriile particulelor alpha în câmpul Coulomb al nucleului de Au


Energia incidenta 10 MeV

176
Simularea unui experiment de fizică

Figura 9.6

traiectoriile particulei alpha în câmpul Coulomb al nucleului de Au;


energia incidenta 5 MeV

Figura 9.7
secţiunea Rutherford pentru împrăştierea particulei alpha pe Ag,
energia incidenta 10 MeV

177
Simularea unui experiment de fizică

Figura 9.8

sectiunea Rutherford pentru împrăştierea particulei alpha pe Au,


energia incidenta 10 MeV

9.3. Lucrare de verificare

1.Tastează programul trcoul în editorul TP (1pt)


2.Verifică-l din punct de vedere sintactic. (1pt)
3.Rulează programul pentru Ag (A=109, Z=47) la 5 MeV energie
incidentă a particulei α 4.Apasă t pentru vizualizare de traiectorii;
notează dmin şi unghiul maxim de deflecţie (2pt)
5.Rulează programul tot pentru Ag dar la 10 MeV sau 20 MeV.
Observă dmin şi compară-l cu valoarea de la 5 MeV. Ce observi?
(1pt)
6.Repetă pentru Au (A=197, Z=79),observă dmin şi compară-l cu
valorile la aceeaşi energie pentru Ag. Ce observi?
(1pt)
7.Apasă s pentru secţiuni pentru toate cazurile studiate mai sus
(1pt)
8. Compară secţiunile pentru cele 2 ţinte la aceeaşi energie.
(1pt)
Notă: Se acordă un punct din oficiu
Total 10 puncte

178
Simularea unui experiment de fizică

Bibliografie

[1] J.Glenn Brookshear, Introducere în informatică, Teora, 1998

[2] Donald E.Knuth, Algoritmi fundamentali, Teora, 2002

[3] Petre Dimo, Programare în Fortran, EDITURA Didactică şi


pedagogică.

[4] A.Constantinescu, S.S¸erban, V.I.Stoica, Limbajul de programare


Turbo
Pascal, Anima, 2004

[5] W.S.Dorn, D.D.McCracken, metode numerice cu programe în fortran,


Editura Tehnică, 1972

[6] O.Sima, Simularea Monte Carlo a transportului radiaţiilor, ALL, 1994

[7] W.H.Press, B.P.Flannery, S.A.Teukolsky, W.T.Vetterling, Numerical


Recipes; The Art of Scientific Computing, Cambridge University Press,
1986

[8] Louis Lyons, Statistics for nuclear and particle physicists, Cambridge
Univ. Press, 1986

[8] Hans C. Ohanian, Physics,W.W.Norton & Company New York -


London, 1985

179
Proiect cofinanţat din Fondul Social European prin Programul Operaţional Sectorial Dezvoltarea Resurselor Umane 2007-2013
Investeşte în oameni!

Formarea profesională a cadrelor didactice


din învăţământul preuniversitar
pentru noi oportunităţi de dezvoltare în carieră

Unitatea de Management al
Proiectelor cu Finanţare Externă

Str. Spiru Haret nr. 12, Etaj 2,


Sector 1, Cod poºtal 010176,
Bucureºti

Tel: 021 305 59 99


Fax: 021 305 59 89

http://conversii.pmu.ro
e-mail: conversii@pmu.ro

IS
BN
97
3-
0-
04
08
4-
2

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