Transcript

Specializarea

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

FIZICĂ

INFORMATICĂ PENTRU PRELUCRAREA DATELOR FIZICE

Anişoara CONSTANTINESCU Adrian DAFINEI

2010

Proiect cofinanţat din Fondul Social European prin Programul Operaţional Sectorial Dezvoltarea Resurselor Umane 2007-2013Investeşte în oameni!

Formarea profesională a cadrelor didacticedin învăţământul preuniversitar

pentru noi oportunităţi de dezvoltare în carieră

Program de conversie profesională la nivel postuniversitar

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

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

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

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 ix , ni ,1∈ r 3 1.4.2. Extragerea termenului cu valoarea cea mai mare maxx , dintr-un şir ix 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

Cuprins

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

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

Cuprins

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

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

Cuprins

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

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

Introducere

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

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

Introducere

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

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

Introducere

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

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

Introducere

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

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 [email protected] [email protected] 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

Algoritmi

1

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 ix , ni ,1∈ 3 1.4.2. Extragerea termenului cu valoarea cea mai mare maxx , dintr-un şir ix 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

Algoritmi

2

1.1 Obiectivele Unităţii de învăţare 1 - Algoritmi 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.

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.

Algoritmi

3

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 ix , ni ,1∈ Enunţ Consideră că ţi se dau n valori ix , cu ni ,,1= . Găseşte o modalitate prin care să calculezi media aritmetică a acestor valori. Input: valoarea lui n şi valorile ix cu ni ,,1= Output: valoarea mediei dată de relaţia matematică

∑=

=n

iix

nx

1

1 (1.1)

Un algoritm este un proces alcătuit dintr-o mulţime ordonată de paşi

descrişi fără echivoc.

Algoritmi

4

Algoritm: 1. se citeşten 2. se citesc valorile ix 3. se iniţializează cu zero variabila s în care se face suma;

0=s 4. se iniţializează indicele i la 1, 1=i 5. se adună în s valoarea lui ix şi se scrie rezultatul în s,

ixss += 6. se creşte valoarea lui i cu 1,

1+= ii 7. se compară i cu n şi cât timp

ni ≤ se repetă operaţiile începând de la pasul 5; dacă

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

iixs

1

şi poţi calcula valoarea mediei:

9. nsx =

1.4.2. Extragerea termenului cu valoarea cea mai mare maxx , dintr-un şir ix dat.

Enunţ Consideră un şir format din n elemente, având valorile ix , cu ni ,,1= . Stabileşte o modalitate de a determina valoarea cea mai mare maxx a elementelor din acest şir.

Input: valoarea lui n şi valorile ix cu ni ,,1= Output: valoarea cea mai mare din şir , maxx 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ă:

Algoritmi

5

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

Algoritmul se bazează pe schema lui Horner care scrie polinomul

cu i luând valori de la m la 0, . Determină valoarea polinomului pentru o valoare dată x0 a variabilei x.

( ) 011

1 axaxaxaxP mm

mm +⋅+⋅+⋅= −

− (1.2) în forma

( )( )( )( ) 0121)( axaxxaxaxaxP mmm +⋅+⋅+⋅+⋅+⋅= −− (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.

Algoritm: 1. se citeşten 2. se citesc valorile ix 3. se atribuie lui maxx valoarea 1x

1max xx = 4. se ia 2=i 5. se compară maxx cu ix ; dacă

ixx <max atunci se atribuie lui maxx valoarea ix

ixx =max şi se trece la pasul următor; dacă

ixx >max atunci se trece la pasul următor adică

6. se creşte valoarea lui i cu o unitate, 1+= ii

7. se compară i cu n ; cât timp ni ≤

se repetă de la pasul 5; dacă ni >

atunci putem scrie că valoarea celui mai mare element din şir este dată de maxx

Algoritmi

6

1.4.4. Ordonarea crescătoare a unui şir Enunţ Ordonează crescător, după valoare, termenii ix ai unui şir dat cu

ni ,,1= . 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.

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

Algoritmi

7

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

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

Algoritmi

8

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.

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.

1.5. Test de autoevaluare 1

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.

Algoritmi

9

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

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.

Algoritmi

10

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 Formula de calcul a mediei aritmetice ∑

=

=n

iix

nx

1

1

Formula de calcul a valorii unui polinom pentru o valoare dată a variabilei

( )( )( )( ) 0121)( axaxxaxaxaxP mmm +⋅+⋅+⋅+⋅+⋅= −−

Algoritmi

11

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,

02 =+⋅+⋅ cxbxa 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

Algoritmi

12

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

Scheme logice

13

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

Scheme logice

14

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

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

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.

Scheme logice

15

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.

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

Ciclul este o structură iterativă în care o serie de instrucţiuni – corpul ciclului – se execută repetat sub supravegherea unui proces de control

Scheme logice

16

În această schemă logică, i este variabila ce controlează ciclul; ea variază între valorile iniţială, v i şi finală, vf

, 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((vf − 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 (vf − 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.

Scheme logice

17

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

”citeşte n şi x

. 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

in=5, x

” se realizează introducerea datelor de intrare 1=5, x2=9, x3=7, x4 =10 şi x5

=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+x1=0+5=5; i=1+1=2; 2 < 5

Scheme logice

18

(s-a executat ciclul cu valoarea x1

s=s+x

; 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

i =5+x2apoi

=5+9=14; i=2+1=3; 3 < 5,

s=14+x3şi din nou

=14+7=21; i=3+1=4; 4 < 5,

s=21+x4Apoi

=21+10=31; i=4+1=5; 5=5;

s=31+x5Î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

=31+4=35; i=5+1=6;

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 am, am−1,..., a1 , a0 într-un punct x0

. Î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 x0În urma execuţiei blocului ”citeşte m, şi a

= 1. i cu i=m,...,0 şi x0” vei avea în

cursul execuţiei m=4, a4=5, a3=2, a2 =-5, a1 =0, a0 =-3 şi x0=1.

Scheme logice

19

2.4.3. Schemă logică pentru algoritmul de ordonare

Acest algoritm ordonează crescător un şir de valori xi

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

După prima execuţie a ciclului după i de la 1 la j=n-1=6, şirul ia forma:

: 7, -1, 3, 1, 10, 4, -5.

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

Scheme logice

20

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.

2.5. Test de autoevaluare 1 Răspunsurile le găseşti la pagina 21

Scheme logice

21

2.6. Răspunsuri la testul de autoevaluare 1

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

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

Scheme logice

22

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

2.9. Bibliografie 1. Petre Dimo, Programarea în FORTRAN, Editura Didactică şi Pedagogică, Bucureşti, paginile 9-44

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

Elemente de limbaj Turbo Pascal

23

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

Elemente de limbaj Turbo Pascal

24

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

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.

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

Elemente de limbaj Turbo Pascal

25

Dacă pe calculatorul tău, ceva mai vechi, rulează un sistem de operare DOS, editorul Turbo Pascal se activează tastând cuvântul «turbo» la Command Prompt şi ENTER. Pe ecran apare următoarea imagine:

Figura 3.1

Dacă pe calculator rulează ca sistem de operare o variantă oarecare de Windows, se poate activa modul DOS prin tastarea succesiunii de taste deja descrise. Acelaşi rezultat se obţine dacă din meniul Start se face opţiunea Run, urmată de comanda cmd scrisă în fereastra de comenzi. După tastarea la prompter-ul DOS a cuvântului turbo şi a tastei ENTER. Pe ecran apare aceeaşi figură – dar într-o fereastră Windows. Dacă se doreşte rularea limbajului Turbo Pascal în fereastră DOS, unică, se poate tasta (în Windows) combinaţia de taste Alt-Enter. Revenirea la Windows se face cu aceeaşi combinaţie de taste. Un avantaj al utilizării ecranului 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ă

BIOS – acronim pentru basic input/output system (sistem de intrare/ieşire de bază). În cazul calculatoarelor compatibile PC(personal computer), este setul esenţial de rutine software care verifică componentele hardware la pornire , lansează sistemul de operare şi oferă suportul necesar traficului datelor între componentele hardware.

Elemente de limbaj Turbo Pascal

26

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. 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 ( 91 ≤≤ n ) • 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.

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.

Elemente de limbaj Turbo Pascal

27

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.

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

Elemente de limbaj Turbo Pascal

28

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: +, -, *, /

Elemente de limbaj Turbo Pascal

29

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

Elemente de limbaj Turbo Pascal

30

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.

Elemente de limbaj Turbo Pascal

31

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.

Elemente de limbaj Turbo Pascal

32

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 unde lista câmpurilor are diagrama de sintaxă:

Figura 3.6 Referirea la o componentă a unei variabile de acest tip o vei face conform următoarei diagrame de sintaxă:

Figura 3.7

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

Elemente de limbaj Turbo Pascal

33

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.

Elemente de limbaj Turbo Pascal

34

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

Elemente de limbaj Turbo Pascal

35

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

Elemente de limbaj Turbo Pascal

36

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: BA:f → Î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.

Elemente de limbaj Turbo Pascal

37

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.

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

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

Elemente de limbaj Turbo Pascal

38

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.7. Răspunsuri la testul de autoevaluare 1

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

Elemente de limbaj Turbo Pascal

39

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

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

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)

( ) ( )( )

−+

+

+−−+

yzyz

yzyztg.

yxyxyx.

//

222

1

2222

2121

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

Instrucţiuni în Turbo Pascal

40

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

Instrucţiuni în Turbo Pascal

41

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

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

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.

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.

Instrucţiuni în Turbo Pascal

42

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

Instrucţiuni în Turbo Pascal

43

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

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

Instrucţiuni în Turbo Pascal

44

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

Instrucţiuni în Turbo Pascal

45

( 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

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.

Î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

Instrucţiuni în Turbo Pascal

46

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.

Instrucţiuni în Turbo Pascal

47

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

Instrucţiuni în Turbo Pascal

48

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

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

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

Instrucţiuni în Turbo Pascal

49

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

Instrucţiuni în Turbo Pascal

50

• î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’);

Instrucţiuni în Turbo Pascal

51

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,x1, ..., xn

unde în prima poziţie apare numele variabilei tip fişier iar valorile x)

1, ..., xn

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.

trebuie să fie de acelaşi tip cu cel al componentelor fişierului g.

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;

Instrucţiuni în Turbo Pascal

52

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;

Instrucţiuni în Turbo Pascal

53

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

Instrucţiuni în Turbo Pascal

54

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

Instrucţiuni în Turbo Pascal

55

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

Instrucţiuni în Turbo Pascal

56

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.

Instrucţiuni în Turbo Pascal

57

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

TTTeeesssttt dddeee aaauuutttoooeeevvvaaa llluuuaaarrreee 111 --- CCCooonnntttiiinnnuuuaaarrreee 5. Consideră polinomul ( ) 01

11 axaxaxaxP m

mm

m +⋅+⋅+⋅= −− 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.

Instrucţiuni în Turbo Pascal

58

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 lucrupentru a reveni in editorul TP tastati ENTER end.

Instrucţiuni în Turbo Pascal

59

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

Instrucţiuni în Turbo Pascal

60

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.

Instrucţiuni în Turbo Pascal

61

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 02 =+⋅+⋅ cxbxa 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

şi să calculezi matricea produs C, ale cărei elemente sunt date de ∑=

⋅=n

1kj,kk,ij,i bac .

(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

1kj,kk,i ba ş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

Instrucţiuni în Turbo Pascal

62

4.8. Termeni şi expresii cheie

4.9. Bibliografie

1. Anişoara Constantinescu, Simona Şerban, Victor Ionuţ Stoica, Limbajul de programare Turbo Pascal Editura Anima, paginile 25-44.

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

Funcţii şi proceduri în Turbo Pascal

63

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

Funcţii şi proceduri în Turbo Pascal

64

5.1. Obiectivele Unităţii de învăţare 5 - Funcţii şi proceduri în 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

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.

Funcţii şi proceduri în Turbo Pascal

65

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 numerelor iniţiale a şi b, acestea vor trebui copiate în x şi y. Poţi stabili cu uşurinţă etapele programului: • citirea şi afişarea numărătorului a şi numitorului b • copierea lui a în x şi a lui b în y • algoritmul lui Euclid cere x > y • calculul cmmdc pentru numerele x şi y • dacă cmmdc > 1 atunci a şi b se împart la acesta • afişarea numărătorului şi numitorului simplificate EX14.PAS 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 thensimplificare fractie begin a:=a div x; b:=b div x; writeln(’fractie simplificata: ’,a,’/’,b); end else writeln(’fractia nu se poate simplifica’); END.

Variabila globală este o variabilă a cărei valoare poate fi folosită şi modificată oriunde în program

Funcţii şi proceduri în Turbo Pascal

66

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 x:=a; y:=b; 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 end; end cmmdc 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:

Variabila locală este o variabilă de program al cărei domeniu de valabilitate este restricţionat la un blocul de cod în care a fost definită

Funcţii şi proceduri în Turbo Pascal

67

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.

Funcţii şi proceduri în Turbo Pascal

68

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.

Funcţii şi proceduri în Turbo Pascal

69

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

Funcţii şi proceduri în Turbo Pascal

70

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

Funcţii şi proceduri în Turbo Pascal

71

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 )(xf din ecuaţia 0)( =xf ş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

Funcţii şi proceduri în Turbo Pascal

72

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

a

dx)x(f ( 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/

022 sinsin1

d)(Kπ

φθ

φθ ( 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))

Funcţii şi proceduri în Turbo Pascal

73

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

1 213

27

dxx2

x1xI ( 5.4)

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-

Funcţii şi proceduri în Turbo Pascal

74

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

5.5. Recursivitate

Exemple: • pentru numerele naturale, factorialul

>==

0 n 10!

1)!-(n*nn! ( 5.5)

• în ecuaţiile fizicii matematice , polinoamele Legendre

( ) ( ) ( ) ( ) ( )[ ]( )( )

==

−−−= −−

uuP1uP

uP1muP1m2um1uP

1

0

2m1mm

( 5.6)

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

Funcţii şi proceduri în Turbo Pascal

75

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

2. Calculează

( ) !k!kn!nC k

n −=

folosind forma recursivă a funcţiei fact(n) =k

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

>+=≤+====

m n dacãm) m,-P(n 1)-m P(n, m) P(n,m n dacã1)-n P(n, 1 m) P(n,

1n sau 1m dacã 1 m) P(n,

( 5.7)

Funcţii şi proceduri în Turbo Pascal

76

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 ?

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

Funcţii şi proceduri în Turbo Pascal

77

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.

4. Defineşte recursivitatea. 5. Elaborează un program care să afişeze toate permutările de n elemente

Funcţii şi proceduri în Turbo Pascal

78

RRRăăăssspppuuunnnsssuuurrriii lllaaa ttteeessstttuuulll dddeee aaauuutttoooeeevvvaaallluuuaaarrreee --- CCCooonnnttt iiinnnuuuaaarrreee 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

Funcţii şi proceduri în Turbo Pascal

79

5.8. Termeni şi expresii cheie. Formule cheie

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

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

Proprietăţile recursive ale factorialului

>==

0 n 10!

1)!-(n*nn!

Recursivitatea Polinoamelor Legendre

( ) ( ) ( ) ( ) ( )[ ]( )( )

==

−−−= −−

uuP1uP

uP1muP1m2um1uP

1

0

2m1mm

Funcţii şi proceduri în Turbo Pascal

80

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

Grafică în Turbo Pascal

81

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

Grafică în Turbo Pascal

82

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

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

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.

Grafică în Turbo Pascal

83

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.

Grafică în Turbo Pascal

84

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.

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.

Grafică în Turbo Pascal

85

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.

Grafică în Turbo Pascal

86

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;

Grafică în Turbo Pascal

87

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

Grafică în Turbo Pascal

88

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:

Grafică în Turbo Pascal

89

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

Grafică în Turbo Pascal

90

• 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;

Grafică în Turbo Pascal

91

• 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),

Grafică în Turbo Pascal

92

(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+130); outtextxy(140,20*i+130,cstil[i]); setlinestyle(i,0,thickwidth);line80,20*i+130,130,20*i+130);

Grafică în Turbo Pascal

93

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

Grafică în Turbo Pascal

94

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:

130 -120x 2x - 9x - x (x) f 234 += Î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;

Grafică în Turbo Pascal

95

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

Grafică în Turbo Pascal

96

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?

6.4. Test de autoevaluare 1

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

Grafică în Turbo Pascal

97

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.

7. Imaginea trebuie rescalată cu maxy

400yscal;maxx

600xscal == ;

valorile maxime trebuie fixate în program 8. Revenirea la ecranul alfanumeric se face cu procedura CloseGraph

6.5. Răspunsuri la testul de autoevaluare 1

Grafică în Turbo Pascal

98

6.6. Termeni şi expresii cheie

6.7. Lucrare de verificare

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

6.8. Bibliografie

1. Anişoara Constantinescu, Simona Şerban, Victor Ionuţ Stoica, Limbajul de programare Turbo Pascal Editura Anima, paginile 89-112.

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.

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

Algoritmi Complecşi

99

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

Algoritmi Complecşi

100

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

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

mm121012n1n dddddddN −−−−−−= ( 7.1) se subînţelege că valoarea avută în vedere este

mm

11

00

11

2n2n

1n1n rdrdrdrdrdrdN −

−−

−−

−−

− ⋅++⋅+⋅+⋅++⋅+⋅= ( 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

21012 10510410310210145,123 −− ⋅+⋅+⋅+⋅+⋅= ( 7.3)

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

Algoritmi Complecşi

101

Î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

21012 212021202101,101 −− ⋅+⋅+⋅+⋅+⋅= ( 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 1nd − este cifra cea mai reprezentativă a numărului iar cifra md− 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 sistemul de numeraţie

Numele sistemului

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 = bn−1

2n−1 + ... + b121 + b020

Problema constă în găsirea cifrelor b( 7.5)

i• împarte numărul întreg N cu 2; vei obţine un număr întreg, Q

. Algoritmul operaţiei este următorul: 1, şi restul

b0; Q1Q

are expresia 1 = bn−1 2n−2 + ... + b120

• împarte Q( 7.6)

1 la 2; vei obţine un număr întreg, Q2 şi restul b1• Continuă acest procedeu până când obţii câtul zero şi rest cifra cea mai semnificativă, b

.

n−1

Algoritmi Complecşi

102

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)

Q bi 53:2

i 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 N10 este N2

= 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

mm

22

11 2b2b2bN −

−−

−−

− ⋅++⋅+⋅= ( 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, F1

1mm

121 2b2bF +−

−−

− ⋅++⋅=

care are expresia: ( 7.8)

• înmulţim F1 cu 2 şi obţinem cifra b−2F

ca întreg şi un număr fracţionar

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

2

Ca exemplu îţi propunem să urmăreşti procedura de trecere le reprezentarea binară a numărului zecimal N10

= 0.3 prezentată în figura 7.3. Conform algoritmului de înmulţire repetată:

.........10.2 1.22*0.610.6 1.62*0.800.8 0.82*0.400.40.42*0.210.2 1.22*0.600.6 0.62*0.3

bF -ii

→=→=→=→=→=→=

Figura 7.3

Algoritmi Complecşi

103

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:

00

11

22

33

44

55 2b2b2b2b2b2bN ⋅+⋅+⋅+⋅+⋅+⋅= ( 7.9)

sau, pentru a evita folosirea puterilor lui 2, ( )( )( )( ) 012345 b2b2b2b2b2bN +⋅+⋅+⋅+⋅+⋅= ( 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

53212021202121N 012345 =⋅+⋅+⋅+⋅+⋅+⋅= ( 7.11) fie ca

( )( )( )( ) 5312021202121N =+⋅+⋅+⋅+⋅+⋅= ( 7.12) Se vede că numărul întreg maxim pentru un număr n dat de cifre binare este 12n − ; 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:

44

33

22

11 2b2b2b2bN −

−−

−−

−−

− ⋅+⋅+⋅+⋅= ( 7.13) sau în forma :

( )( )( )41

31

21

11 b2b2b2b2N −

−−

−−

−−

− ⋅+⋅+⋅+⋅= ( 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:

28125.02120202120N 54321 =⋅+⋅+⋅+⋅+⋅= −−−−− ( 7.15) valoare pe care o obţii utilizând şi forma a doua. Într-adevăr a doua formulă dă

( )( )( ) 28125.0)120(2021202N 11111 =⋅+⋅+⋅+⋅+⋅= −−−−− ( 7.16)

Algoritmi Complecşi

104

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

Reprezentare 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 N8

N

=346.25 conform cu regula stabilită mai sus, obţii evident

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 N2Aplicâ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

= 11100110.01010

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ă

Algoritmi Complecşi

105

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?

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

Cifra Zecimală

Cifra Binară

Cifra Octală

Cifra 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

Algoritmi Complecşi

106

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 ( ) 0xF = ( 7.18)

în care ( )xF este o funcţie polinomială. Vei spune că x0 este o rădăcină a ecuaţiei dacă înlocuind x cu x0( ) 0xF 0 =

se obţine ( 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 x0 ε î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:

130x120x2x9x)x(F 234 −⋅+⋅−⋅−= ( 7.20)

Algoritmi Complecşi

107

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

0)b(f)a(f <⋅ ) ş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ă 0)c(f)a(f <⋅ ( şi evident 0)b(f)c(f >⋅ ) înseamnă că rădăcina se află în intervalul [a, c] şi atunci vei relua algoritmul punând b=c . Dacă 0)c(f)a(f >⋅ rădăcina se află în intervalul ]b,c[ şi vei relua algoritmul punând ca = . 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.

Algoritmi Complecşi

108

Programul în TP pentru găsirea celor 4 rădăcini ale ecuaţiei 0130x120x2x9x)x(f 234 =−⋅+⋅−⋅−= ( 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 ( ) 0xF = . 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: ( )( )1n

1n1nn x'F

xFxx−

−− −= ( 7.22)

unde xn este valoarea lui x în iteraţia n iar xn−1

Condiţiile de convergenţă sunt:

este valoarea lui x în iteraţia anterioară.

• Să se plece cu o valoare iniţială a rădăcinii aproximative x0

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

• Este necesar ca derivata secundă a funcţiei ( )x"F să nu fie prea mare, • Este necesar ca derivata primă a funcţiei ( )x'F 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(xn − xn−1În continuare este prezentat programul în TP pentru găsirea rădăcinilor ecuaţiei

) <ε ) fie când s-a atins un număr maxim de iteraţii, itermax.

0130x120x2x9x)x(f 234 =−⋅+⋅−⋅−= 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];

Algoritmi Complecşi

109

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ă

01

12m

2m1m

1mm

m axaxaxaxa)x(F +⋅++⋅+⋅+⋅= −−

−− ( 0.8)

Pentru scrierea unei soluţii generale pentru ecuaţia algebrică vei folosi tot metoda Newton-Raphson dar pentru evaluarea lui F(x0) şi a lui F’(x0

( ) 00 bxx)x(Q)x(F +−⋅=

) vei folosi următorul algoritm. Vei scrie polinomul F(x) sub forma

( 7.23) cu

11

22m

1m1m

m bxbxbxb)x(Q +⋅++⋅+⋅= −−

− ( 7.24) Observă că

00 b)x(F = ( 7.25) şi că

( )00 xQ)x('F = ( 7.26) Problema se reduce deci la a evalua b0 şi Q(x0

( ) 10 cxx)x(R)x(Q +−⋅=). Scriind şi Q(x) ca

( 7.27) cu

233m

1m2m

m cxcxcxc)x(R +⋅++⋅+⋅= −−

− ( 7.28) se vede că Q(x0) = c1 Aşadar trebuie să calculezi b

( 7.29) 0 şi c1 pentru fiecare x0

( )( )0

0

x'FxF

0xx −=

în decursul iteraţiilor de găsire a unei rădăcini a polinomului, expresia

( 7.30)

având acum forma

1

0

cb

0xx −= ( 7.31)

Algoritmi Complecşi

110

Dacă înlocuieşti în ecuaţia (7.24) ( ) 00 bxx)x(Q)x(F +−⋅= expresiile polinoamelor F(x) şi Q(x) obţii

( ) ( )

++⋅++⋅+⋅⋅−=

=+⋅++⋅+⋅+⋅−

−−

−−

−−

011

22m

1m1m

m0

01

12m

2m1m

1mm

m

bbxbxbxbxxaxaxaxaxa

( 7.32)

şi identificând coeficienţii diferitelor puteri ale lui x obţii expresiile coeficienţilor b j

⋅+==

+ 01jjj

mm

xbabab

:

( 7.33)

cu j mergând de la m-1 la 0. La fel introducând în ecuaţia ( 7.34) ( ) 10 cxx)x(R)x(Q +−⋅= expresiile lui Q(x) şi R(x), vei obţine:

( ) ( )

++⋅++⋅+⋅⋅−=

=+⋅++⋅+⋅−

−−

−−

1233m

1m2m

m0

11

22m

1m1m

m

ccxcxcxcxxbxbxbxb

( 7.35)

de unde, prin identificarea coeficienţilor puterilor lui x, vei găsi relaţiile pentru coeficienţii ck

⋅+==

+ 01jkk

mm

xcbcbc

( 7.36)

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;

Algoritmi Complecşi

111

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

0130x120x2x9x)x(f 234 =−⋅+⋅−⋅−= 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].

Algoritmi Complecşi

112

7.5.1. Metoda Gauss-Seidel

Poţi urmări principiul metodei de rezolvare pe cazul unui sistem de 3 ecuaţii algebrice liniare:

=⋅+⋅+⋅=⋅+⋅+⋅=⋅+⋅+⋅

3333232131

2323222121

1313212111

bxaxaxabxaxaxabxaxaxa

( 7.37)

Presupune că elementele diagonale sunt nenule

≠≠≠

0a0a0a

33

22

11

( 7.38)

În acest caz ecuaţiile de mai sus se pot scrie sub forma.

( )

( )

( )

⋅−⋅−=

⋅−⋅−=

⋅−⋅−=

232131333

3

323121222

2

313212111

1

xaxaba1x

xaxaba1x

xaxaba1x

( 7.39)

Pornind cu o soluţie aproximativă a sistemului de ecuaţii, ( ))0(3

)0(2

)0(1 x,x,x şi

înlocuind-o în sistemul (7.39) vei obţine o nouă aproximaţie a necunoscutelor xi

( )

( )

( )

⋅−⋅−=

⋅−⋅−=

⋅−⋅−=

)1(232

)1(1313

33

)1(3

)0(323

)1(1212

22

)1(2

)0(313

)0(2121

11

)1(1

xaxaba1x

xaxaba1x

xaxaba1x

:

( 7.40)

Procedura continuă cât timp

( )( ) ε>− − )1k(i

)k(i xxABSMAX ( 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:

Algoritmi Complecşi

113

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.

Algoritmi Complecşi

114

Pentru rezolvarea sistemului de ecuaţii algebrice liniare:

−=+−−

=−+−−

=−−+−−=−−+−−=−−⋅

1x4xx2xx4xx6xxx4xx2xxx4x1xxx4

543

5432

54321

4321

321

( 7.42)

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 x1 = 1, x2 = 2, x3 = 3, x4 = 2 şi x5

= 1

7.5.2. Metoda Gauss-Jordan

Consideră din nou sistemul de ecuaţii algebrice liniare (7.37). Consideră că

0a11 ≠ceea ce – evident – nu este o restricţie (sistemul are cel puţin un coeficient nenul). Dacă în forma primară

( 7.43)

0a11 =

11

211 a

am =

ecuaţiile se rearanjează pentru a satisface condiţia. Defineşte multiplicatorul

( 7.44)

înmulţeşte prima ecuaţie a sistemului (7.37) cu m1

11

312 a

am =

şi scade-o din a doua ecuaţie. Defineşte şi multiplicatorul

( 7.45)

cu care înmulţeşte prima ecuaţie a sistemului după care scade-o din a treia. Noul sistem de ecuaţii are forma

=⋅+⋅=⋅+⋅=⋅+⋅+⋅

3333232

2323222

1313212111

'bxax'a'bxax'a

bxaxaxa ( 7.46)

În a doua ecuaţie a sistemului coeficientul necunoscutei x1

0ama 11121 =⋅− este

( 7.47) iar coeficienţii celorlalte necunoscute şi termenul liber sunt

⋅−=⋅−=⋅−=

1122

1312323

1212222

bmb'bama'aama'a

( 7.48)

În a treia ecuaţie a sistemului coeficientul necunoscutei x1

0ama 11m31 =⋅− este

( 7.49)

Algoritmi Complecşi

115

iar coeficienţii celorlalte necunoscute şi termenul liber sunt

⋅−=⋅−=⋅−=

1233

1323333

1223232

bmb'bama'aama'a

( 7.50)

Verifici dacă pentru noul sistem coeficientul necunoscutei x2 din a doua ecuaţie este nenul,

0'a 22 ≠ ( 7.51) (dacă nu – rearanjezi sistemul) şi defineşti un nou multiplicator.

22

323 'a

'am = ( 7.52)

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

=⋅=⋅+⋅=⋅+⋅+⋅

3333

2323222

1313212111

"bx"a'bxax'a

bxaxaxa ( 7.53)

cu coeficienţii ecuaţiei a treia daţi de expresiile

⋅−=⋅−=

2333

2333333

'bm'b"b'am'a"a

( 7.54)

Metoda descrisă mai sus este adesea numită metoda reducerii gaussiene. Astfel, dacă

0'a 33 ≠ ( 7.55) poţi calcula

( )

( )

⋅−⋅−=

⋅−=

=

313212111

1

323222

2

33

33

xaxaba1x

x'a'b'a1x

'a"b

x

( 7.56)

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

integralelor ∫ ⋅=b

a

dx)x(fI cu restricţiile că a şi b sunt valori finite iar f(x)

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.

Algoritmi Complecşi

116

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:

( )

( )

+=

++++++=≈ −−

ihafy

yyy2y2y2y2hII

i

n1n2n210Trapeze ( 7.57)

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 hiaxi ⋅+= 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:

( )

( )

+=

++++++=≈ −−

ihafy

yy4y2y2y4y3hII

i

n1n2n210Simpson ( 7.58)

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.

Algoritmi Complecşi

117

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

Algoritmi Complecşi

118

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

ydxdy

= ( 7.59)

are ca soluţie o funcţie de forma xea)x(y ⋅= ( 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 xe)x(y = . 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ă

( )

==

00 yxy)y,x(f'y ( 7.61)

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 )x(y ) este determinată numeric, iterativ. Aceasta înseamnă că plecând de la condiţia iniţială se pot determina punctele care constituie soluţia ( )( )mm xy,x printr-o metodă iterativă în care se foloseşte valoarea soluţiei existente în punctul precedent xm, ym pentru a găsi ym+1

Algoritmi Complecşi

119

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:

( )4321m1m kk2k2k6hyy ++++=+ ( 7.62)

unde ( )

( )

++=

++=

++=

=

3mm4

2mm3

1mm2

mm1

hky,hxfk2

hky,2hxfk

2hky,

2hxfk

y,xfk

( 7.63)

Eroarea de trunchiere este 5hK ⋅≈ε . 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ă

( )

=

=

10y

ydxdy

( 7.64)

Folosind formulele de mai sus, se pot calcula valorile )h(y , h fiind pasul cu care este parcurs domeniul valorilor variabilei x.

+++=

++=

+=

=

2hky

2hyhyk

2hky

2hyk

2hkyk

yk

1mmm4

1mm3

1m2

m1

( 7.65)

astfel că, în conformitate cu relaţia (7.62)

++++⋅=+ 24

h6h

2hh1yy

432

m1m ( 7.66)

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

.

1)0(y;ydx/dy == pentru ( )1,0x∈ cu pas 0.1 este

Algoritmi Complecşi

120

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;

Algoritmi Complecşi

121

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

Caracteristicile metodei au determinat folosirea sa într-o varietate de domenii.

încercări; pentru folosirea metodei sunt necesare calculatoare performante - care există astăzi curent.

Un exemplu simplu este calculul integralei

dxxI1

0

⋅= ∫ ( 7.67)

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 1x0;1x0 ≤≤≤≤ 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 1x0;1x0 ≤≤≤≤

Figura 7.7

Algoritmi Complecşi

122

Deoarece analitic valoarea integralei este 3/2I = 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 x)

1/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

acest ultim caz, în care punctul a căzut în aria de interes, un contor , N1 este incrementat ( crescut) cu o unitate.

şi atunci punctul determinat se află în interiorul ariei determinate de graficul funcţiei. În

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

( ) ( )11 NNN

111 qp

!NN!N!Np,N,NB −

−= ( 7.68)

unde p1q −= 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ă

( ) Npp,N,NBN)N(E0N

1111

== ∑∞

=

( 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

( ) ( )[ ] ( ) ( )[ ]( ) ( ) Npqp1NppNNpp1NN

NENENpNENvar222

21

21

211

=−=−+−

=−=−= ( 7.70)

Abaterea standard este ( ) ( )[ ] ( ) 2/12

11 NpqNpNEN ±=−±=σ ( 7.71) Deviaţia standard a estimării N1/N a ariei de sub curba y = x1/2

( )Npq

NNpq

NNvar

NNvar 22

11 ==≡

este

( 7.72)

Npq

NN1 ±=

σ ( 7.73)

Pentru cazul considerat la N=100 valoarea aşteptată pentru N1 este

aproximativ 67,0N,32100 1 ≈⋅ iar 2

310

31

32100)N( 1 ≈⋅⋅=σ

şi ( )( ) 047.030

2100

3/13/2NN1 ≈=≈

σ sau %7

3/2047.0

≈≈ε

Algoritmi Complecşi

123

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

a

dx)x(fy ( 7.74)

cu aceeaşi metodă. «Pornirea» metodei Monte Carlo se face dacă defineşti un dreptunghi «de ţintă» după cum urmează

c)x(f0,bxa ≤≤≤≤=ℜ ( 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

c)ab(

dx)x(f

NN

b

a1

−≈∫

( 7.76)

de unde înţelegi că

c)ab(NNdx)x(f 1

b

a

−≈∫ ( 7.77)

este valoarea aproximativă a integralei. Practic, pentru fiecare punct generat aleator ( )ii ,ηξ se verifică respectarea condiţiei

( )ii f ξη ≤ ( 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

integralei ∫=b

a

dx)x(fI . Dacă notezi ξ o mărime aleatoare distribuită

uniform în domeniu ( )b,a cu densitatea de probabilitate ( )( )

∉∈−

=b,axdacă0b,axdacă)ab/(1

)x(pξ ( 7.79)

Poţi defini o speranţă matematică a funcţiei ( )ξf cu expresia

( )[ ] Iab

1dx)x(p)x(ffEb

a −== ∫ ξξ ( 7.80)

Presupune că se fac N încercări în urma cărora se obţin valorile N21 ,,, ξξξ ale mărimii aleatoare ξ . Deoarece pentru numere mari

speranţa matematică a funcţiei este dată de

( )[ ] ( )∑=

≈N

1iif

N1fE ξξ ( 7.81)

Algoritmi Complecşi

124

rezultă că pentru un număr suficient de mare de încercări

( )∑=

−≈

N

1iif

NabI ξ ( 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

1ppp n21 =+++ ( 7.83) Un număr aleator, r, uniform distribuit în intervalul [0, 1) care satisface relaţia:

i211i21 ppprppp +++≤≤+++ − ( 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

a

1dx)x(p ( 7.85)

relaţia

( )∫=x

a

dpr ξξ ( 7.86)

determină unic pe x ca funcţie de r. Acesta este principiul metodei Monte Carlo – aşa cum se aplică el pentru variabile continue.

Algoritmi Complecşi

125

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

( )( )ab

axab

drx

a −−

=−

= ∫ξ ( 7.87)

de unde ( )abrax −+= ( 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ă 0)x(f ≥ în acest interval. Dacă vei analiza următorul program vei vedea că acesta calculează

∫1

0

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

Algoritmi Complecşi

126

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

integrala ∫ ⋅1

0

dx)x(f pentru forme ale lui f(x) deja considerate în

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

( )20

21 RR

dRR2SdSdR)R(p

−⋅⋅

==ππ ( 7.89)

Algoritmi Complecşi

127

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

( )( )( )2

021

20

2R

R20

21

R

R RRRR

dRR

2d)(pr00

−−

=⋅−

== ∫∫ ρρρρ ( 7.90)

astfel că ( )2

021

20 RRrRR −⋅+= ( 7.91)

În ceea ce priveşte unghiului θ care este uniform distribuit pe intervalul [0, 2π], densitatea de probabilitatea are expresia

πθθθ

2dd)(p = ( 7.92)

şi

∫ ==θ

πθΨΨ

0 2d)(pr ( 7.93)

de unde r2 ⋅= πθ ( 7.94)

Astfel

==

θθ

sinRycosRx

( 7.95)

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.

Algoritmi Complecşi

128

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.

Algoritmi Complecşi

129

111...Descie scrierea poziţională a unui număr. 2..Decide dacă poate avea rădăcini în intervalul ),( ba o funcţie polinomială pentru care 0)()( >⋅ bfaf . 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 ),( ba . 5. Scrie relaţia recurentă de rezolvare a ecuaţiilor diferenţiale cu metoda Runge Kutta de ordin 4.

TTTeeessstttuuulll dddeee aaauuutttoooeeevvvaaa llluuuaaarrreee 111 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

7.9. Test de autoevaluare 2

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

7.10. Răspunsuri la testele de autoevaluare

Algoritmi Complecşi

130

TTTeeessstttuuulll dddeee aaauuutttoooeeevvvaaa llluuuaaarrreee 222 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 bxax == ,

5. Soluţia se scrie sub forma ( )4321m1m kk2k2k6hyy ++++=+

unde

( )

( )

++=

++=

++=

=

3mm4

2mm3

1mm2

mm1

hky,hxfk2

hky,2hxfk

2hky,

2hxfk

y,xfk

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

Algoritmi Complecşi

131

7.12. Lucrare de verificare

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

Formule cheie Scrierea poziţională

mm

11

00

11

2n2n

1n1n rdrdrdrdrdrdN −

−−

−−

−−

− ⋅++⋅+⋅+⋅++⋅+⋅= Formula rădăcinii aproximative iterate în metoda Newton

( )( )1n

1n1nn x'F

xFxx−

−− −=

Integrarea numerică prin metoda trapezelor

( )

( )

+=

++++++=≈ −−

ihafy

yyy2y2y2y2hII

i

n1n2n210Trapeze

Integrare Runge Kutta de ordin 4

( )4321m1m kk2k2k6hyy ++++=+

( )

( )

++=

++=

++=

=

3mm4

2mm3

1mm2

mm1

hky,hxfk2

hky,2hxfk

2hky,

2hxfk

y,xfk

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

Algoritmi Complecşi

132

7.13. Bibliografie

1. W.S.Dorn, D.D. Mc Crocken, Metode numerice cu programe în Fortran, Editura Tehnică, p 13-49

Prelucrarea statistică a datelor experimentale

133

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

Prelucrarea statistică a datelor experimentale

134

8.1. Obiectivele Unităţii de învăţare 8 Prelucrarea statistică a datelor experimentale

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

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

Prelucrarea statistică a datelor experimentale

135

∑=

=N

1iix

N1x ( 8.1)

iar abaterea valorii xi de la x va fi ∆i dată de: xxii −=∆ ( 8.2)

de unde rezultă că fiecare măsurare individuală se aşează în jurul valorii medii

ii xx ∆+= ( 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 .

( )

=−=

=−== ∑∑∑

===

0xx

xxN1xx

N1

N1 N

1ii

N

1ii

N

1ii

∆∆ ( 8.4)

Abaterea pătratică medie, varianţa, este însă diferită de zero. Această mărime este definită ca

( )

( )

>−=

+−=

−===

∑∑

=

==

0xxxxx2xN1

xxN1

N1

22N

1i

2i

2i

2x

N

1i

2i

N

1i

2i

22x

σ

∆∆σ ( 8.5)

de unde şi 22 xx > ( 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

2x ∆σ = ( 8.7)

numită abatere standard şi abaterea standard relativă definită de:

x

2

x∆ε = ( 8.8)

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

( )∑=

−−

=N

1i

2i

2x xx

1N1σ ( 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 .

Prelucrarea statistică a datelor experimentale

136

Nx

σ = ( 8.10)

Astfel crescând numărul de măsurări ale mărimii x, varianţa 2xσ 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 2

xσ 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 N/2

xσ 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

∑=

jj

jjj

m

xmx ( 8.11)

şi

( )

1m

xxm

jj

j

2jj

2x

−=

∑σ ( 8.12)

Varianţa asupra valorii medii este

∑=

jj

2x2

mu σ ( 8.13)

Pentru distribuţii continue, valoarea medie şi varianţa sunt date respectiv de formulele

∫ ⋅⋅= dxxxnN

x )(1 ( 8.14)

( )∫ ⋅−⋅= dxxx)x(nN1 22

xσ ( 8.15)

unde

∫= dx)x(nN ( 8.16)

Factorul (N -1) din formula lui 2xσ 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

a dispersiei σ sunt date de formulele:

cu diferite erori σi , atunci cele mai bune estimări ale lui a şi

∑=

2i

2i

i

1

a

a

σ

σ ( 8.17)

Prelucrarea statistică a datelor experimentale

137

şi

∑= 2i

2

11σσ

( 8.18)

Astfel rezultatul experimentului i urmează a fi ponderat cu un factor 2i/1 σ

. Într-un anume sens, 2i/1 σ 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

ii n

1≈σ ( 8.19)

şi formulele de mai sus devin

=

=

∑∑ ∑

i

iii

nN

n/ana ( 8.20)

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

( )( )

∂∂

+∂∂

+=

++=+=

jy,x

iy,x

ji

jiijji

yf

xfy,xf)y,x(f

y,xfff)y,x(f

∆∆

∆∆∆ ( 8.21)

Ai neglijat termenii de ordin mai înalt decât unu. Identificând: ( )

∂∂

+∂∂

=

=

jy,x

iy,x

ij yf

xff

y,xff

∆∆∆ ( 8.22)

Abaterea medie pătratică a funcţiei f este, prin definiţie

( )

( ) ( )

∂∂

+

∂∂

=

∂∂

+

∂∂

=

∂∂

+∂∂

==

∑ ∑

∑∑

2y

22x

22f

i j

2j

22

i

22f

i j

2

ji2

ij2f

yf

xf

yf

xf

N1

yf

xf

N1f

σσσ

∆∆σ

∆∆∆σ

( 8.23)

conform definiţiei (8.5) şi a faptului că suma produselor ∆i ∆j conţine termeni ce se vor anula.

Prelucrarea statistică a datelor experimentale

138

Generalizând, pentru o funcţie f (x1, x2, ..., xm ) de m variabile xk ( m,1k = ):

∑=

∂∂

=m

kk

xf x

f1

22

2 σσ ( 8.24)

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;

Prelucrarea statistică a datelor experimentale

139

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

∫∞

∞−

=1dx)x(p ( 8.25)

pentru x continuu şi respectiv

∑=

=N

1ii 1)x(p ( 8.26)

pentru x discret, N fiind numărul de valori posibile pentru xi

Prelucrarea statistică a datelor experimentale

140

Parametrii importanţi ce caracterizează o distribuţie sunt valoarea medie definită de

∫∞

∞−

⋅⋅= dx)x(pxµ ( 8.27)

pentru o mărime care variază continuu şi respectiv

∑=

⋅=N

1iii )x(pxµ ( 8.28)

pentru o mărime cu variaţie discretă abaterea pătratică medie (varianţa) definită de:

( )

⋅⋅>=<

−>=<⋅⋅−=

∫∞

∞−

∞−

dx)x(pxx

xdx)x(px

22

2222 µµσ ( 8.29)

respectiv

( )∑=

⋅−=N

1ii

2i

2 )x(px µσ ( 8.30)

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

( ) ( ) kNk p1p!kN!k

!N)k(P −−−

= ( 8.31)

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

Distribuţia binomială este normată la unitate

de unde şi numele acestei distribuţii.

( ) ( ) ( ) 1qpp1p!kN!k

!N)k(P NN

0k

kNkN

0k=+=−

−= ∑∑

=

=

( 8.32)

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

1ppp s21 =+++ ( 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.

Prelucrarea statistică a datelor experimentale

141

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

2k se calculează prin sumare şi nu prin integrare. ( )( )

( )

=+=

−−

=⋅=

=

−−

=∑∑

NpqpNpk

qp!kN!k

!1NNp)k(Pkk

1N

N

0k

kN1kN

0k ( 8.34)

unde s-a ţinut seama că numărul combinărilor de N obiecte luate câte k, kNC este

( )!kN!k!NC k

N −= ( 8.35)

şi că există relaţia 1k1N

kN CNCk −

−⋅=⋅ ( 8.36) La fel

( )[ ]

( ) ( )

+−=+−=

+−=⋅= ∑∑==

2222

N

0k

N

0k

22

pNp1NpNpp1NNk

)k(Pk1kk)k(Pkk ( 8.37)

şi NpqpNpNNpqkk 2222222 =−+=−=σ ( 8.38)

Valoarea aşteptată a lui k ( realizarea evenimentului de probabilitate p) fiind Npk = putem estima p ca raportul N/k şi de asemeni o aproximaţie a varianţei cu

−=

Nk1

NkN

1NNs 2 ( 8.39)

Din relaţiile (8.34) şi (8.38) se vede că k2 <σ 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 k2 ≈σ 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. )ttancons(mNpdar,N,0p =∞→→ ( 8.40)

distribuţia binomială trece în distribuţie Poisson

ttanconsp,N =∞→ ( 8.41)

distribuţia binomială trece în distribuţie Gauss.

Prelucrarea statistică a datelor experimentale

142

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

mNp,N,0p =∞→→ ( 8.42) Dacă introduci p = m / N în expresia distribuţiei binomiale vei obţine

( )( ) ( )

+−−

=

−=

kNk

kNk

Nm1

Nm

!k1kN1NN)k(P

Nm1

Nm

!kN!k!N)k(P

( 8.43)

Dacă N este foarte mare atunci ( ) ( ) 1

N1kN1NN

kNlim =

+−−

∞→

( 8.44)

şi

mN

N

kN

Ne

Nm1

Nm1 limlim −

∞→

∞→

=

−=

− ( 8.45)

astfel că forma distribuţiei Poisson este: m

k

e!k

m)k(p −= ( 8.46)

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:

=

==max

max

0

0k

ii

k

iii

n

knm ( 8.47)

în care ni este frecvenţa cu care s-a obţinut valoarea ki .

∑=

=max

0

k

iinN ( 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

∑∞

=

=0 !k

mk

ek

m ( 8.49)

rezultă

∑∞

=

=0

1)(k

kp ( 8.50)

Prelucrarea statistică a datelor experimentale

143

2. valoarea sa medie este m.

( )

=−

=

==

∑∑∞

=

−−

=

−∞

=

mekmmk

ek

mkkkpk

k

mk

k

mk

k

0

100

!1

!)(

( 8.51)

3. abaterea standard este m

( )[ ]

( ) ( )

+=−

+−

=

+−==

∑∑

∑∑∞

=

−−∞

=

−−

=

=

mmekmme

kmmk

kpkkkkpkk

k

mk

k

mk

kk

2

0

1

0

222

00

22

!1!2

)(1)( ( 8.52)

rezultă că (vezi şi relaţiile 8.5)

mkkk =−=22σ ( 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

)()1( mpmp =− ( 8.54) dacă m este întreg: 6. distribuţia Poisson are un singur parametru independent. Acesta este valoarea medie m. Cu

( ) ( ) ( ) mk

tk

k ek

mek

ttp −⋅− =⋅

=!!

µµ ( 8.55)

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

nn ±

= m. Aceasta este baza cunoscutei formule

( 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, ( )ii kpN ⋅=ν şi reprezintă grafic histograma.

Prelucrarea statistică a datelor experimentale

144

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 5=k 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;

Prelucrarea statistică a datelor experimentale

145

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 σ

Prelucrarea statistică a datelor experimentale

146

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

( )2

2

2

21)( σ

µ

πσ

−−

=x

exp ( 8.57)

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

∫∞

∞−

= 1)( dxxp ( 8.58)

(reaminteşte-ţi o proprietate importantă a integralei Euler - că

∫∞

∞−

− = πdue u 2

)

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

=

=

πσµ

µ

21)(p

x ( 8.61)

4.prin integrare numerică se poate verifica faptul că probabilitatea ca o valoare măsurată,x, să aparţină intervalului ( )σµσµ +− , este

( ) ∫+

==+≤≤−σµ

σµ

σµσµ 693.0)( dxxpxr ( 8.62)

analog pentru intervalele de 2σ şi 3σ,

( ) ∫+

==+≤≤−σµ

σµ

σµσµ2

2

954.0)(22 dxxpxr ( 8.63)

( ) ∫+

==+≤≤−σµ

σµ

σµσµ3

3

9973.0)(33 dxxpxr ( 8.64)

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

Prelucrarea statistică a datelor experimentale

147

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

Prelucrarea statistică a datelor experimentale

148

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

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

adică un astfel de efect ” nu poate ” să se întâmple dacă teoria este corectă.

Prelucrarea statistică a datelor experimentale

149

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 bxay +⋅= , matematic, condiţia de mai sus se scrie

( ) minim1

2

2

=−⋅−

= ∑=

n

i i

ii bxaySσ

( 8.65)

Pentru găsirea minimului expresiei, trebuie determinate punctele critice, în care derivatele parţiale se anulează, adică, succesiv

0=∂∂aS ( 8.66)

din care rezultă

01

21

21

2

2

=⋅

−+ ∑∑∑===

n

i i

iin

i i

in

i i

i yxxbxaσσσ

( 8.67)

şi

0=∂∂bS ( 8.68)

din care rezultă

011

21

21

2 =−+ ∑∑∑===

n

i i

in

i i

n

i i

i ybxaσσσ

( 8.69)

Ansamblul relaţiilor(8.67)(8.69) formează un sistem de 2 ecuaţii cu 2 necunoscute, a şi b. Notând

ii

p=21σ

( 8.70)

Prelucrarea statistică a datelor experimentale

150

ponderea unei măsurări, sistemul se scrie:

⋅=+⋅

⋅⋅=⋅+⋅

∑∑∑

∑∑∑

===

===

n

iii

n

ii

n

iii

n

iiii

n

iii

n

iii

yppbxpa

yxpxpbxpa

111

111

2

( 8.71)

cu soluţiile

⋅−

⋅⋅

⋅⋅⋅

⋅−

⋅⋅

=

⋅−

⋅⋅

⋅⋅

⋅−

⋅⋅⋅

=

∑∑∑

∑∑∑∑

∑∑∑

∑∑∑∑

===

====

===

====

2

11

2

1

1111

2

2

11

2

1

1111

n

iii

n

iii

n

ii

n

iiii

n

iii

n

iii

n

iii

n

iii

n

iii

n

ii

n

iii

n

iii

n

iiii

n

ii

xpxpp

yxpxpypxpb

xpxpp

ypxpyxppa

( 8.72)

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

⋅⋅

=

⋅⋅

=

∑∑

∑∑∑∑

∑∑

∑∑∑

==

====

==

===

2

11

2

1111

2

2

11

2

111

n

ii

n

ii

n

iii

n

ii

n

ii

n

ii

n

ii

n

ii

n

ii

n

ii

n

iii

xxn

yxxyxb

xxn

yxyxna

( 8.75)

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)

∂∂

+⋅

∂∂

=⇒=

∂∂

+⋅

∂∂

=⇒=

22

22

2

22

22

2

),(

),(

yxb

yxa

yb

xbyxbb

ya

xayxaa

σσσ

σσσ ( 8.76)

Cum am presupus că erori se fac doar în y rezultă că σx = 0 şi deci

Prelucrarea statistică a datelor experimentale

151

∂∂

=

∂∂

=

=

=

n

iy

ib

n

iy

ia

yb

ya

1

22

2

1

22

2

σσ

σσ ( 8.77)

cu yyyy n

σσσσ ==== 21

( 8.78) Cum

2

2

11

2

12

−⋅

=

∂∂

∑∑

==

=

n

ii

n

ii

n

iii

i xxn

xxn

ya ( 8.79)

rezultă

yn

ii

n

ii

a

xxn

n σσ ⋅

=

∑∑==

2

11

2

( 8.80)

La fel, din 2

2

11

2

11

22

=

∂∂

∑∑

∑∑

==

==

n

ii

n

ii

n

iii

n

ii

i xxn

xxx

yb ( 8.81)

rezultă

yn

ii

n

ii

n

ii

b

xxn

xσσ ⋅

=

∑∑

==

=2

11

2

1

2

( 8.82)

Î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

Prelucrarea statistică a datelor experimentale

152

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

Prelucrarea statistică a datelor experimentale

153

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

Prelucrarea statistică a datelor experimentale

154

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

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 3

32

210 xaxaxaay +++= ( 8.83) atunci plecând tot de la condiţia:

( ) minim1

233

2210 =−−−−= ∑

=

n

ii xaxaxaayS ( 8.84)

se obţine următorul sistem de 4 ecuaţii cu 4 necunoscute (a0, a1, a2 şi a3) din anularea derivatelor parţiale

=∂∂

=∂∂

=∂∂

=∂∂

0;0

0;0

32

10

aS

aS

aS

aS

( 8.85)

⋅=+++⋅

⋅=+++⋅

⋅=+++⋅

=+++⋅

∑∑∑∑∑

∑∑∑∑∑

∑∑∑∑∑

∑∑∑∑

=====

=====

=====

====

n

1ii

3i

n

1i

6i3

n

1i

5i2

n

1i

4i1

n

1i

3i0

n

1ii

2i

n

1i

5i3

n

1i

4i2

n

1i

3i1

n

1i

2i0

n

1iii

n

1i

4i3

n

1i

3i2

n

1i

2i1

n

1ii0

n

1ii

n

1i

3i3

n

1i

2i2

n

1ii10

yxxaxaxaxa

yxxaxaxaxa

yxxaxaxaxa

yxaxaxaNa

( 8.86)

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.

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

Prelucrarea statistică a datelor experimentale

155

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;

Prelucrarea statistică a datelor experimentale

156

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

Figura 8.2

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

Prelucrarea statistică a datelor experimentale

157

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;

Prelucrarea statistică a datelor experimentale

158

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.

Prelucrarea statistică a datelor experimentale

159

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ă

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

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

Prelucrarea statistică a datelor experimentale

160

1. ( )

621654321

61

=+++++=m .

2. 108/315

3. ∑=

∂∂

=m

kk

xf x

f1

22

2 σσ

4. Numărul cerut este coeficientul lui x2 în dezvoltarea

5

65

61

+x adică 55

325 6

125065

=C

5. 2

11

2

1

1111

⋅−

⋅⋅

⋅⋅

⋅−

⋅⋅⋅

=

∑∑∑

∑∑∑∑

===

====

n

iii

n

iii

n

ii

n

iii

n

iii

n

iiii

n

ii

xpxpp

ypxpyxppa

8.7. Răspunsuri la testul de autoevaluare 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

Prelucrarea statistică a datelor experimentale

161

Formule cheie Formula de calcul a mediei ∑

=

=N

1iix

N1x

Formula de calcul a abaterii pătratice medii

( )

( )

>−=

+−=

−===

∑∑

=

==

0xxxxx2xN1

xxN1

N1

22N

1i

2i

2i

2x

N

1i

2i

N

1i

2i

22x

σ

∆∆σ

Distribuţia binomială

( ) ( ) kNk p1p!kN!k

!N)k(P −−−

=

Distribuţia Poisson m

k

e!k

m)k(p −=

Distribuţia Gauss ( )

2

2

2

21)( σ

µ

πσ

−−

=x

exp

Dreapta de fit

⋅⋅

=

⋅⋅

=

∑∑

∑∑∑∑

∑∑

∑∑∑

==

====

==

===

2

11

2

1111

2

2

11

2

111

n

ii

n

ii

n

iii

n

ii

n

ii

n

ii

n

ii

n

ii

n

ii

n

ii

n

iii

xxn

yxxyxb

xxn

yxyxna

Prelucrarea statistică a datelor experimentale

162

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.

8.10. Bibliografie

1.Numerical Recipes – The art of Scientific Computing. W.H.Press, Cambridge Press.

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

Simularea unui experiment de fizică

163

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

Simularea unui experiment de fizică

164

9.1. Obiectivele Unităţii de învăţare 9 Simularea unui experiment de fizică

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

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 .

Simularea unui experiment de fizică

165

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

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.

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

Simularea unui experiment de fizică

166

Figura 9.1

min0

221

2

42 reZZMvEcin πε

== ( 9.1)

cu fmMeVe ⋅= 44.14/ 02 πε , 79,2,4.6 21 === ZZMeVEα se obţine

fmr 5,35min = 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

( ) ( )rUrrvE +⋅+⋅=⋅

= 2222

22θµµ ( 9.2)

poţi scoate derivata în raport cu timpul a lui r

( )( ) 222 θµ

rrUEdtdr

−−⋅= ( 9.3)

Din conservarea momentului cinetic orbital ⋅=⋅⋅=⋅⋅ Lrbv θµµ 2 ( 9.4)

poţi scoate derivata în raport cu timpul a lui θ.

2rL

dtd

⋅⋅

θ ( 9.5)

Dacă elimini timpul între relaţiile de mai sus găseşti

1

2

22

2 22

−−=

rLUE

rL

drd

µµµθ ( 9.6)

Simularea unui experiment de fizică

167

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

( ) ∫ ≤−−

−=Θmin

02/1

2rb

wEUdwr ππ

obţii funcţia de deflecţie

( 9.7)

Pentru

reZZrU0

221

4)(

πε= ( 9.8)

vei obţine unghiul θ de împrăştiere a particulei α legat de parametrul de ciocnire şi de energia cinetică prin relaţia

EbeZZtg

22

221=

θ ( 9.9)

Secţiunea geometrică de interacţiune este

=

=

θπ

θσ

πσ

ddbb

dd

b

2

2

( 9.10)

şi

2sin4

12 4

2221

θσ

=

Ω EeZZ

dd ( 9.11)

bine cunoscuta formulă Rutherford pentru descrierea distribuţiei unghiulare a particulelor α împrăştiate pe Au sau Ag.

Simularea unui experiment de fizică

168

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

fmEcc

Ek74.0

221

2≈===

µµλ ( 9.12)

cu

+=

=

⋅=

2

21

212

2 5.93132.197

mcAA

AAc

MeVmcfmMeVc

µ

( 9.13)

şi ( ) 0

3/12

3/110 1.7 rAArR ≈+= ( 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

( ) ( )rUrr −+= 222 θµ 2

L ( 9.15)

unde ( )( ) 2

2121 / mcAAAA +=µ ( 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ă

reZZrVrU Coulomb0

221

4)()(

πε== ( 9.17)

Ecuaţiile de mişcare Lagrange sunt, în forma generală

0=∂∂

∂∂

ii qL

qLdt

d ( 9.18)

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

Simularea unui experiment de fizică

169

• î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

3/12int 5.1 Ar =

220 0xlatbr += ( 9.19)

• se calculează θ0 din relaţia ( )0/0 xlatbarctg=−θπ ( 9.20)

• se calculează viteza iniţială v0 a particulei incidente din energia iniţială a acesteia

Ev=

2

20µ ( 9.21)

• se calculează 0θ din conservarea momentului cinetic orbital

=

==

20

00

02

00

rbv

rbvL

θ

θµµ

( 9.22)

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;

Simularea unui experiment de fizică

170

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

Simularea unui experiment de fizică

171

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

Simularea unui experiment de fizică

172

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

Simularea unui experiment de fizică

173

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

Simularea unui experiment de fizică

174

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;

Simularea unui experiment de fizică

175

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

Simularea unui experiment de fizică

176

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

Simularea unui experiment de fizică

177

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

Simularea unui experiment de fizică

178

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

Simularea unui experiment de fizică

179

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

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 99Fax: 021 305 59 89

http://conversii.pmu.roe-mail: [email protected]

ISBN 973-0-04084-2

Proiect cofinanţat din Fondul Social European prin Programul Operaţional Sectorial Dezvoltarea Resurselor Umane 2007-2013Investeşte în oameni!

Formarea profesională a cadrelor didacticedin învăţământul preuniversitar

pentru noi oportunităţi de dezvoltare în carieră


Recommended