Date post: | 03-Feb-2017 |
Category: |
Documents |
Upload: | nguyenkhuong |
View: | 240 times |
Download: | 1 times |
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
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.
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ă.
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
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
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.
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.
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 ……
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 ψ.
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.
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.
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,……
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.
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.
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,…
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.
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.
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;
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;
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;
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;
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;
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.
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