+ All Categories
Home > Documents > 6. Metode de proiectare a algoritmilor

6. Metode de proiectare a algoritmilor

Date post: 03-Feb-2017
Category:
Upload: nguyenkhuong
View: 240 times
Download: 1 times
Share this document with a friend
24
1 1/24 6. 6. Metode Metode de de proiectare proiectare a a algoritmilor algoritmilor (de (de elaborare elaborare a a programelor programelor ) ) Rafinare Rafinare in in pasi pasi succesivi succesivi Programare Programare Procedurala Procedurala Programare Programare Structurata Structurata Programare Programare Top_Down Top_Down Bottom_Up Bottom_Up Programare Programare Modulara Modulara ~ ~ TAD TAD Programare Programare Orientata Orientata Obiect Obiect componente componente , , evenimente evenimente , , C C 6 6 / 9.11.2012 / 9.11.2012
Transcript
Page 1: 6. Metode de proiectare a algoritmilor

11/24

6.6. MetodeMetode de de proiectareproiectare a a algoritmiloralgoritmilor(de (de elaborareelaborare a a programelorprogramelor))

RafinareRafinare in in pasipasi succesivisuccesivi

ProgramareProgramare ProceduralaProcedurala

ProgramareProgramare StructurataStructurata

ProgramareProgramare Top_DownTop_Down –– Bottom_UpBottom_Up

ProgramareProgramare ModularaModulara ~ ~ TADTAD

ProgramareProgramare OrientataOrientata ObiectObiect

…… componentecomponente, , evenimenteevenimente, , ……

CC66 / 9.11.2012/ 9.11.2012

Page 2: 6. Metode de proiectare a algoritmilor

22/24

RafinareRafinare îînn papaşşii succesivisuccesivi –– Stepwise Stepwise RafinamentRafinament

Rafinare la nivel micro (descompunerea unui modul - subprogram). Top-Down : la nivel macro. În aceste versiuni succesive apar multe enunţuri nestandard ceurmează a fi precizate treptat prin propoziţii standard. Se recomandă ca ele sărămână comentarii în versiunea finală. Algoritmul apare în versiuni succesive, tot mai complet de la o versiune la alta. În versiunea finală în algoritm apar numaipropoziţii standard.

Un proces de detaliere pas cu pas a specificaţiei, denumit proiectare descendentă. Algoritmul apare în diferite versiuni succesive, fiecare fiind o detaliere a versiuniiprecedente. Succesiune de versiuni intermediare, o versiune se obtine prin rafinarerafinarea uneia precedent:

P0 P1 … Pn

La nivel micro se doreşte obţinerea unui modul în versiune finală. Într-o versiuneintermediară pot fi prezente numai părţile importante ale acestuia, urmând să se revină asupra detaliilor în versiunile următoare, după ce aspectele importante au fostrezolvate Se amana detaliile neseminficative, concentrandu-ne la problemele(partile) importante.

Page 3: 6. Metode de proiectare a algoritmilor

33/24

ProgramareProgramare proceduralăprocedurală

Paradigmă în programare, stil în programare prin care un program apeleazăsubprograme (functii si proceduri, pentru a rezolva subprobleme) prin transmitereacorespunzatoare a parametrilor (actuali, aflati în corespondentă cu parametriiformali descrisi in subprograme).

ProgramareProgramare structuratăstructurată

Disciplină în programare prin folosirea unor structuri bine precizate (fără Goto). Orice problemă se poate descrie doar prin utilizarea următoarelor trei structuri:

• secventială• alternativă,• repetitivă.

Page 4: 6. Metode de proiectare a algoritmilor

44/24

ProgramareProgramare Top_DownTop_Down –– Metoda descendentă

Urmăreste (la nivel macro) descompunerea unei probleme complexe însubprobleme. Avantajul principal: permite programatorului să reducă complexitateaproblemei, subproblemele în care a fost descompusă fiind mai simple, şi să amânedetaliile pentru mai târziu. În momentul în care descompunem problema însubprobleme nu ne gândim cum se vor rezolva subproblemele ci care sunt ele şiconexiunile dintre ele.

Proiectarea descendentă permite lucrul în echipe mari. Prin descompunereaproblemei în mai multe subprobleme, fiecare subproblemă poate fi dată sprerezolvare unei subechipe. Fiecare subechipă nu cunoaşte decât subproblema pe care trebuie să o rezolve.

PrincipalPrincipal

DateDate CalculCalcul RezultateRezultate

SS11 SS22 SS33

ArboreleArborele de de programareprogramare:: ExempluExemplu:: RezRez. . SistemSistem

Cit.SistCit.Sist.. SistemSistem Tip.SistTip.Sist..

ReduceReduce RezolvaRezolva

CautPivotCautPivot Sch_LiniiSch_Linii Fac_ZeroFac_Zero

Page 5: 6. Metode de proiectare a algoritmilor

55/24

ProgramareProgramare BottomBottom--Up Up –– Metoda ascendentă

Utilizând propoziţiile limbajului şi subalgoritmi existenţi, îi asamblează în alţisubalgoritmi pentru a ajunge în final la algoritmul dorit. Deci, va fi scris mai întâisubalgoritmul apelat şi apoi cel care apelează. Ca rezultat al proiectării ascendentese ajunge la o mulţime de subalgoritmi care se apelează între ei. Este important să se cunoască care subalgoritm apelează pe care, lucru redat printr-o diagramă de structură, ca şi în cazul programării descendente.

Această metodă are marele dezavantaj că erorile de integrare vor fi detectatetârziu, abia în faza de integrare. Se poate ajunge abia acum la concluzia că uniisubalgoritmi, deşi corecţi, nu sunt utili.

De cele mai multe ori nu se practică o proiectare ascendentă sau descendentăpură ci o combinare a lor, o proiectaremixtămixtă:

Top_DownTop_Down & BottomBottom--UpUp.

Pr.Pr.

SS11 SS22 SS33

SS2121 SS2222 SS2323

Page 6: 6. Metode de proiectare a algoritmilor

66/24

ProgramareProgramare ModularăModulară –– ModulModul

Prin proiectareproiectare ((programareprogramare) ) modularămodulară înţelegem metoda de proiectare(programare) a unui algoritm pentru rezolvarea unei probleme prin folosireamodulelormodulelor.

ModululModulul este considerat o unitate structurală de sine stătătoare, fie program, fie subprogram, fie o unitate de program. Un modul poate conţine sau poate fi conţinutîntr-alt modul si poate fi format din mai multe submodule.

Este important ca fiecare modul să-şi aibă rolul său bine precizat, să realizeze o funcţie în cadrul întregului program (proiect).

În limbajele de programare cu structură de bloc (de exemplu în Turbo PascalTurbo Pascal, ) UnitUnit-urile pot fi considerate module. La compilarea separată un grup de subprograme compilate deodată constituie un modul, dar acest modul poate ficonsiderat ca o mulţime de submodule din care este compus.

Modulele sunt relativ independente, dar cu posibilităţi de comunicare între ele. Astfel, un modul nu trebuie să fie influenţat de maniera în care se lucrează îninteriorul altui modul. Orice modificare ulterioară în structura unui program, dacăfuncţia pe care o realizează un modul M încă este necesară, acest modul trebuie săfie util şi folosit în continuare fără modificări.

Page 7: 6. Metode de proiectare a algoritmilor

77/24

…… ProgramareProgramare ModularăModulară –– ModulModul

Programarea modulară se bazează pe descompunerea problemei în subproblemeşi proiectarea şi programarea separată a subalgoritmilor corespunzători. Programarea modulară este strâns legată de programarea ascendentă şi de programarea descendentă, ambele presupunând folosirea subalgoritmilor pentrutoate subproblemele întâlnite.

Avantajele programării modulare: • Descompunerea unei probleme complexe în subprobleme este un mijlocconvenabil şi eficient de a reduce complexitatea. • Testarea unui modul se poate face mult mai uşor decât testarea întreguluialgoritm. • Permite munca mai multor programatori. S-a ajuns astfel la munca în echipă, princare se ajunge la scurtarea termenului de realizare a produsului program.• Modulele se pot refolosi ori de câte ori avem nevoie de ele. Astfel, s-a ajuns la compilarea separată a subprogramelor şi la păstrarea subprogramelor obţinute înbiblioteci de subprograme, de unde ele se pot refolosi la nevoie. • Reutilizabilitatea acestor subprograme duce la mărirea productivităţii înprogramare, dar şi la creşterea siguranţei în realizarea unui produs corect.• Permite înlocuirea modulului în incorect cu altul mai performant.• Modulele se pot verifica mai uşor. Se pot înţelege şi poate analiza mult mai usoravand texte scurte.

Page 8: 6. Metode de proiectare a algoritmilor

88/24

7.7. TipuriTipuri abstracteabstracte de de datădată

Tip Abstract de Tip Abstract de datdatăă

ProgramareProgramare ModularăModulară

ModulModul îînn Pascal=UnitPascal=Unit

CC6 / 3.11.2010 6 / 3.11.2010 ……

Page 9: 6. Metode de proiectare a algoritmilor

99/24

Tip abstract de Tip abstract de datădată

Tipul abstract de date (Tad): mulţime de valori, D, care formeazădomeniul tipului, împreună cu o mulţime de operatori pe acest domeniu.

Tad este definit (de ) în urma unui proces de abstractizare, precizat

prin:

- domeniul Tad este precizat ca o mulţime matematică, D ;

- operatorii definiţi în acest domeniu. Valorile pentru care operaţia o are

sens satisfac un predicat φ numit precondiţie pentru operaţia o.

Rezultatul efectuării operaţiei o depinde de operanzi, este legat de aceşti

operanzi, legătură precizată cu ajutorul unei postcondiţii, dată printr-un

predicat ψ.

Page 10: 6. Metode de proiectare a algoritmilor

1010/24

OperaOperaţţiiii ::

Un tip abstract de date trebuie să conţină suficiente operaţii pentru a fiutil. El trebuie să permită creareacrearea oricăreioricărei valorivalori din domeniul tipului. Trebuie să existe suficiente operaoperaţţiiii de de testaretestare pentru a putea fi verificatetoate precondiţiile operaţiilor. Trebuie concepute suficiente operaţii pentruca programatorul să aibă accesacces la la oricareoricare din din componentelecomponentele din care e compus acest tip abstract de date.

Deci tipurile de operaţii pe care le conţine un TadTad sunt:

- operaţii de intrare-ieşire; // Nu neaparat! Pot fi in program!- operaţii de construire de valori din domeniul tipului;- operaţii de conversie (de valori din alte tipuri) în valori de acest tip;- operaţii de testare a unor condiţii;- operaţii de selectare a unor componente ale acestui tip de date.

Page 11: 6. Metode de proiectare a algoritmilor

1111/24

Exemplu: TadTad numărnumăr raraţţionalional QQ :

DomeniulDomeniul : mulţimea numerelor raţionale, notată prin QQ :QQ = {(m,n) | mZ, nN+, (m,n)=1}.

OperaOperaţţiiii::OperaOperaţţiaia "Adun(q1,q2,q)":"Adun(q1,q2,q)": { q := q1 + q2 }{ q := q1 + q2 }

Precondiţia: q1, q2 Q ;Postcondiţia: q = q1 + q2 .

OperaOperaţţiaia "Scad(q1,q2,q)":"Scad(q1,q2,q)": { q := q1 { q := q1 -- q2 }q2 }Precondiţia: q1, q2 Q ;Postcondiţia: q = q1 - q2 .

OperaOperaţţiaia "Inmult(q1,q2,q)":"Inmult(q1,q2,q)": { q := q1 * q2 }{ q := q1 * q2 }Precondiţia: q1, q2 Q ;Postcondiţia: q = q1*q2.

OperaOperaţţiaia "Divid(q1,q2,q)":"Divid(q1,q2,q)": { q := q1 : q2 }{ q := q1 : q2 }Precondiţia: q1, q2 Q şi q2≠0;Postcondiţia: q = q1/q2.

Page 12: 6. Metode de proiectare a algoritmilor

1212/24

OperaOperaţţiiii::OperaOperaţţiaia ""Atribc(sus,jos,qAtribc(sus,jos,q)";)"; { q:= { q:= sus/jossus/jos}}

Precondiţia: sus Z, jos N şi jos≠0;Postcondiţia: q = sus/jos.

OperaOperaţţiaia ""Citeste(qCiteste(q)";)"; {q:= {q:= numărnumăr raraţţionalional cititcitit}}Precondiţia: se introduce ca pereche (numărător, numitor).Postcondiţia: q = numărul raţional citit.

OperaOperaţţiaia ""Tipareste(qTipareste(q)";)"; { Se { Se afiafişşeazăează numărulnumărul q}q}Precondiţia: q QPostcondiţia: se afişează pe ecran numărul q

RelaRelaţţiaia ""Estezero(qEstezero(q)";)"; { Este q { Este q egalegal cu zero ?}cu zero ?}Precondiţia: q QPostcondiţia: Estezero= (q=0)

RelaRelaţţiaia "Egal(q1,q2)";"Egal(q1,q2)"; { Este q1 { Este q1 egalegal cu q2 ?}cu q2 ?}Precondiţia: q1, q2 QPostcondiţia: Egal= (q1=q2)

RelaRelaţţiaia "Maimare(q1,q2)";"Maimare(q1,q2)"; { Este q1 { Este q1 maimai mare mare decâtdecât q2 ?}q2 ?}Precondiţia: q1, q2 QPostcondiţia: Maimare = (q1>q2)

FuncFuncţţiaia ""Intreg(qIntreg(q)";)"; { { ParteaPartea îîntreagăntreagă a a luilui q}q}Precondiţia: q QPostcondiţia: Intreg = [q]. // // …… NumaratorNumarator, , NumitorNumitor ((Get,SetGet,Set), Inv,), Inv,……

Page 13: 6. Metode de proiectare a algoritmilor

1313/24

AvantajeleAvantajele folosiriifolosirii tipurilortipurilor abstracteabstracte de date:de date:• specificarea exactă, • independenţa implementării, • ascunderea informaţiei, • simplitate şi integritate. • Prin abstractizare ne putem concentra asupra proprietăţilor esenţiale şi nu asupra reprezentării şi implementării; accentul cade asupra specificăriitipului abstract de date. • Utilizatorul se va folosi doar de această specificare, el nu vedereprezentarea şi nici modul de implementare a operaţiilor. • Tipurile abstracte de date constituie unul din mijloacele care permit o abordare sistematică şi prin a căror utilizare se ajunge la realizarea unormodule corecte şi refolosibile. • Mai mult, aceste module se pot organiza în biblioteci utile, ducând la creşterea productivităţii în programare.

Page 14: 6. Metode de proiectare a algoritmilor

1414/24

Module (Module (UnitUnităăţţii de program de program îînn) Pascal :) Pascal :

Prin modul - unitateunitate de programde program (Unit) Pascal înţelegem o grupare de declaraţii (constante, tipuri, variabile şi subprograme) şi eventual o secţiunede iniţializare.

Un modulmodul (unitunit) este compus dintr-o parte de interfaţă (InterfaceInterface) şi unade implementare (ImplementationImplementation).

InterfaInterfaţţaa constă din acele elemente ale unităţii care sunt disponibile(vizibile) în exterior.

Partea de implementareimplementare nu este accesibilă în afara unităţii şi ea constă din constante, tipuri de date, variabile, funcţii, proceduri şi instructiuni (toateacestea fiind locale) care sunt referite în funcţiile şi procedurile descrise îninterfaţă. Ea este invizibilă din alte unităţi de program.

Page 15: 6. Metode de proiectare a algoritmilor

1515/24

StructuraStructura unuiunui modulmodul (Unit) :(Unit) :

Forma generală a unei unităţi este următoarea :UnitUnit <Nume_Unitate>;InterfaceInterface

<Listă_declaraţii_globale>ImplementationImplementation

<Listă_declaraţii_locale>[ [ BeginBegin {opţională}

<Secvenţă_de_iniţializare> ]]End.End.

În InterfaceInterface se definesc constante, tipuri de dată, variabile, funcţii şi proceduri, accesibile altor unităţi care folosesc această unitate de program. În aceste unităti, elementele declarate în secţiunea InterfaceInterface devin globale, putând fi folosite ca oricevariabile globale dintr-un program Pascal, spre deosebire de elementele declarate însecţiunea ImplementationImplementation, acestea fiind locale şi nefiind accesibile din afara unităţii.

SecvenSecvenţţaa de de iniiniţţializareializare conţine instrucţiuni care vor fi executate implicit înainteaprogramului principal în scopul unor iniţializări.

•• DomeniuDomeniu (date, atribute, …)

•• OperatiiOperatii (functii <antete>)• ... C,T,…

Page 16: 6. Metode de proiectare a algoritmilor

1616/24

UtilizareaUtilizarea ((referireareferirea) ) unuiunui modulmodul (Unit) :(Unit) :

Un program sau o unitate de program care doreşte să folosească un Unit trebuie săprecizeze acest lucru printr-o declaraţie de forma:

UsesUses <ListăListă_uni_unitătăţţi_utilizatei_utilizate>;

Pe lângă unităţile de program pe care le scrie utilizatorul, acesta mai poate folosicâteva unităţi standard oferite de mediul Turbo PascalTurbo Pascal. Menţionăm următoareleunităţi:

• SystemSystem - conţine proceduri şi funcţii de bază, predefinite, din Turbo Pascal (esteinclusă automat în orice program, fără a mai fi necesară clauza Uses);

• CrtCrt - conţine constante, funcţii, proceduri, etc. de lucru cu ecranul şi tastatura;• GraphGraph - conţine constante, variabile, tipuri de dată, funcţii şi proceduri grafice;• DosDos - conţine subprograme de lucru cu fişiere.

Page 17: 6. Metode de proiectare a algoritmilor

1717/24

ExempluExemplu: :

Se apelează Unitul Rational pentru calculul unei expresii. Aici se poate vedeacât de simplă este realizarea unui astfel de program având la dispoziţie acest tip. Înacest exemplul s-a reuşit ca operaţiile de intrare-ieşire să fie cele obişnuite ( Read / Write ).

Program Numere__Rationale; { x+y y+z z+x }UsesUses RationalRational; { E = ----- * ----- * ------ }Var x,y,z : RationaleRationale; { x-y y-z z-x }Begin { x,y,z e Q (de forma p/q, q<>0) }Write (' x : '); Readln (x);Write (' y : '); Readln (y);Write (' z : '); Readln (z);Writeln (' E = ', ProdQ( ProdQ ( ImpcQ (AdunQ(x,y),ScadQ(x,y) ),

ImpcQ (AdunQ(y,z),ScadQ(y,z)) ),ImpcQ (AdunQ(z,x),ScadQ(z,x))));

ReadlnEnd.

Page 18: 6. Metode de proiectare a algoritmilor

1818/24

Unit Rational;Unit Rational;InterfaceInterfaceType RationaleRationale = String [20];Function AdunQ ( a,b : Rationale) : Rationale;Function ScadQ ( a,b : Rationale) : Rationale;Function ProdQ ( a,b : Rationale) : Rationale;Function ImpcQ ( a,b : Rationale) : Rationale;Function InversQ ( a : Rationale) : Rationale;

ImplementationImplementationType QQ = Record

Numarator,Numitor : Integer

End;Function Function CmmdcCmmdc ((a,b:Integera,b:Integer) : Integer;) : Integer; { Alg. Euclid { Alg. Euclid recursivrecursiv }}BeginIf b=0 Then Cmmdc := a

Else Cmmdc := Cmmdc (b, a Mod b)End;

Page 19: 6. Metode de proiectare a algoritmilor

1919/24

Function Function CmmmcCmmmc ((a,b:Integera,b:Integer) : Integer;) : Integer;Begin

Cmmmc := a*b Div Cmmdc (a,b)End;

Procedure Procedure SimplificSimplific ( ( VarVar x : Q);x : Q);Var p:Integer;BeginWith x Do Begin

p:=Cmmdc(Numarator,Numitor);If p>1 Then Begin

Numarator:=Numarator Div p;Numitor :=Numitor Div p

End;If Numitor<0 Then Begin

Numarator:= - Numarator;Numitor := - Numitor

EndEnd

End;

Page 20: 6. Metode de proiectare a algoritmilor

2020/24

Procedure Procedure TransfQTransfQ ( ( s:Rationales:Rationale; ; VarVar x : Q );x : Q ); { String { String Q }Q }Var p,q:Integer;BeginWith x Do Begin { s de forma ‘numarator/numitor’ , de ex. ’3/2’ }

Val (s,Numarator,p); { p = poz. car ’/’ }Val (Copy(s,1,p-1),Numarator,q);Val (Copy(s,p+1,Length(s)-p),Numitor,q);If Numitor=0 Then Begin

Write ('<',s,'>',' Numitor=0'); ReadlnEnd;Simplific (x)

EndEnd;

Function Function TransfRTransfR ( x : Q ) : Rationale;( x : Q ) : Rationale; { Q { Q String }String }Var m, n : String;BeginWith x Do Begin Str (Numarator, m); Str (Numitor, n) End;TransfR:=m+'/'+n

End;

Page 21: 6. Metode de proiectare a algoritmilor

2121/24

Procedure Procedure TipQTipQ ( x : Q );( x : Q ); { { TiparesteTipareste (q) }(q) }BeginWith x Do Write (Numarator,'/',Numitor);

End;

Function Function AdunQAdunQ ( ( a,ba,b : Rationale) : Rationale;: Rationale) : Rationale; { { a+ba+b }}Var x,y, z : Q;Begin TransfQ(a,x); TransfQ(b,y); {z:=x+y}With z Do Begin

Numitor := Cmmmc (x.Numitor,y.Numitor);Numarator := x.Numarator * (Numitor Div x.Numitor)+

y.Numarator * (Numitor Div y.Numitor)End;Simplific(z); AdunQ:=TransfR(z)

End;

Function Function ScadQScadQ ( ( a,ba,b : Rationale ) : Rationale;: Rationale ) : Rationale; { a{ a--b }b }Var y:Q;Begin

TransfQ(b,y); With y Do Numarator := -Numarator; { a+(-b)}b:=TransfR(y); ScadQ:=AdunQ (a,b)

End;

Page 22: 6. Metode de proiectare a algoritmilor

2222/24

Function Function ProdQProdQ ( ( a,ba,b : Rationale) : Rationale;: Rationale) : Rationale; { a*b }{ a*b }Var x,y, z:Q;Begin

TransfQ(a,x); TransfQ(b,y); { z:= x*y }With z Do Begin

Numarator := x.Numarator * y.Numarator;Numitor := x.Numitor * y.Numitor

End;Simplific (z);ProdQ:=TransfR(z)

End;

Function Function InversabQInversabQ ( a : Rationale ) : Boolean;( a : Rationale ) : Boolean; {{NumaratorNumarator <> 0}<> 0}Var x:Q;Begin

TransfQ(a,x); InversabQ:=x.Numarator<>0;

End;

Page 23: 6. Metode de proiectare a algoritmilor

2323/24

Function Function InversQInversQ ( a : Rationale ) : Rationale;( a : Rationale ) : Rationale; { { m/nm/n n/mn/m }}Var x : Q; n : Integer;Begin

TransfQ (a,x);With x Do Begin

If InversabQ(a) Then Beginn := Numarator;Numarator:= Numitor;Numitor := n

End; End;

InversQ:=TransfR(x)End;Function Function ImpcQImpcQ ( ( a,ba,b : Rationale) : Rationale;: Rationale) : Rationale; { a / b = a * 1/b}{ a / b = a * 1/b}BeginIf InversabQ (b)

Then ImpcQ:=ProdQ (a,InversQ(b))Else Write (' Operatie ilegala (:0) ')

End;{ Nu are secventa de initializare }

End.

Page 24: 6. Metode de proiectare a algoritmilor

2424/24. . .. . . CC66 / 9.11.2012/ 9.11.2012

1. Tad Natural Natural îînn precizieprecizie maritămarită, pentru a calcula Cmmdc(a,b), apelând << , -- :Program Program Cmmdc_Natural_MaritCmmdc_Natural_Marit;;UsesUses Prec_MarPrec_Mar;;VarVar a, b : Natural;a, b : Natural;Begin

Write (' Dati a : '); Readln (a);Write (' Dati b : '); Readln (b); { Date a,b; }While a<>b Do { Cat_Timp a <> b Executa }

If MaiMic (a,b) Then b:=Dif(b,a) { Daca a<b Atunci b:=b-a }Else a:=Dif(a,b); { Altfel a:=a-b }

Write (' Cmmdc = ',a); { Sf_Cat_Timp; }Readln { Rezultate a; }

End.

TemeTeme::

2. TadTad IntregIntreg îînn precizieprecizie maritămarită.. Z Z NN

3. TadTad PolinomPolinom cu coeficienti ComplecsiComplecsi pentru a calcula P(zP(z).). P P CC

4. TadTad MultimeMultime de de numerenumere realereale cu maxim 300 de elemente. P P CC


Recommended