Sunteți pe pagina 1din 13

Proiectarea aplicaiilor

autor: Tudor Sorin

n cazul n care vei alege meseria de informatician vei fi pui n situaia de a elabora aplicaii care vor fi efectiv folosite. Etapele de proiectare a aplicaiilor sunt studiate amnunit la disciplina "Sisteme informatice", disciplin predat n facultile de profil. n acest capitol nvm cte ceva, la nivelul cunotinelor dobndite pn n acest moment, despre modul n care se proiecteaz aplicaiile. De la nceput trebuie s tii c, astzi, nu se mai utilizeaz mediile de programare (Borland Pascal, Borland C++), pe care le studiem n liceu din considerente exclusiv didactice. n schimb, majoritatea cunotinelor dobndite prin utilizarea acestor medii sunt indispensabile programrii profesionale. Pentru a realiza aplicaii care se folosesc efectiv n practic este necesar s studiai programarea vizual. Pentru a nelege problemele de care "se lovete" un programator plecm de la ipoteza c suntei angajat la o firm de profil i vi se d sarcina elaborrii unei aplicaii. Suntei solicitat s elaborai un set de subprograme care s permit programatorilor accesul cu uurin la nivel de bit. Ce observm? Enunul este ambiguu, nu se dau nici un fel de amnunte. Nu se precizeaz ce subprograme trebuie scrise, ce trebuie s realizeze. Dar aa se ntmpl n practic. Beneficiarul, n cele mai multe cazuri, nu este informatician. Rareori vei ntlni beneficiari care pot spune clar ce doresc. Mai mult, n timpul elaborrii aplicaiei, beneficiarul poate veni cu cerine noi sau poate schimba cerinele iniiale. Este sarcina dumneavoastr s facei de aa natur nct aplicaia s corespund dorinelor acestuia. Nu trebuie s v enervai i s intrai n conflict cu el. Beneficiarul este cel care pltete, deci poate apela oricnd la serviciile altei firme. n exemplul dat, se presupune c beneficiarul este tot programator, aa c, din acest punct de vedere, sarcinile dumneavoastr sunt mai uoare. Pentru a realiza aplicaia cerut, trebuie s parcurgem mai multe etape.

1
www.ls-infomat.ro | www.manuale-de-informatica.ro

Etapa 1. Analiza problemei


Beneficiarul dorete accesul simplu la nivel de bit. Limbajul de programare nu are instruciuni specializate pentru aceasta i nici nu conine subprograme "gata fabricate" pentru a le folosi n acest scop. Aceasta nseamn c este sarcina dumneavoastr s scriei aceste subprograme. Dar care sunt? Orice programator dorete s poat vizualiza n binar, valoarea reinut de o anumit variabil. Desigur, acesta poate s-i scrie propria secven care s realizeze aceasta, dar n-ar fi mai bine dac ar dispune de un subprogram gata scris? Apoi, este important ca programatorul s poat modifica valoarea memorat de un bit al variabilei. n concluzie, este necesar s scriem un subprogram care s realizeze aceast operaie. Exist situaii n care programatorul dorete s tie ce memoreaz un anumit bit. Aceasta nseamn c trebuie scris un subprogram care s returneze aceast valoare. Sunt suficiente cele trei subprograme? Dac pot afia n binar coninutul unei variabile, dac pot modifica un singur bit al ei, dac pot afla ce valoare memoreaz un anumit bit, se pare c da! Acum trebuie s "botezm" cele dou subprograme. Este important s alegem nume sugestive, pentru ca utilizatorul lor s le poat reine uor. Cele dou subprograme se vor numi Vidaj, Mod_bit, Cit_bit.

Etapa 2. Proiectarea propriu-zis a aplicaiei (Concepia)


n etapa anterioar am stabilt subprogramele de care avem nevoie. Acum este necesar s gndim modul n care acestea vor fi utilizate. Cu alte cuvinte, trebuie s analizm parametrii formali ai subprogramelor i modul n care acestea returneaz rezultatele. Vidaj. Are rolul de a afia coninutul n binar (baza 2) a unei variabile. Avem variabile care ocup 2 octei, deci trebuie s afim 16 valori, variabile care ocup 6 octei, deci trebuie afiate 48 valori. Cam mult! Utilizatorul va avea reale dificulti n a "descifra" informaia pe care o primete. Toate acestea ne conduc la ideea de a afia informaia n hexa. Traducerea n binar este imediat, spaiul ocupat de rezultat nu este aa mare. Nu este lipsit de interes s analizm i modul de afiare. Rezultatul trebuie afiat de aa natur nct s poat fi citit cu uurin de beneficiar. Din acest motiv, ntre valorile reinute de doi octei se va afia un spaiu, ca mai jos: FF 01 BA C7 D3 E8.

2
www.ls-infomat.ro | www.manuale-de-informatica.ro

Rezultatul va fi returnat sub form de ir de caractere - string. Desigur, s-ar fi putut ca rezultatul s fie afiat de subprogram. n acest caz, posibilitile programatorului ar fi limitate. Poate c acesta dorete, ca rezultatul s fie prelucrat n alte secvene. Parametrii formali sunt: numele variabilei i numrul de octei ocupai de aceasta. Obinem astfel urmtorul antet: function Vidaj(var nume;lungime:byte):string;

Mod_bit. Are rolul de a modifica coninutul unui bit al variabilei. Spre deosebire de subprogramul anterior unde transmiterea se face prin valoare ca s afim coninutul unei variabile este suficient acest mecanism, de aceast dat ar trebui utilizat mecanismul de transmitere prin referin. Apare o problem: transmiterea prin referin cere s fie cunoscut tipul variabilei. Dar, subprogramul trebuie s poat "aciona" asupra oricrui tip de variabil. Atunci? Soluia este de a utiliza transmiterea prin valoare, dar s fie transmis adresa variabilei. n concluzie, primul parametru va fi de tip pointer -adr_var. Ca i la subprogramul anterior, trebuie transmis lungimea variabilei: lungime.

Aa cum am nvat, o variabil ocup mai muli octei consecutivi. n cazul variabilelor numerice octeii sunt ocupai invers: octetul cel mai puin semnificativ este primul memorat, iar cel mai semnificativ ultimul. Aceasta este o informaie pe care trebuie s o cunoasc utilizatorul. Dac dorim modificarea unui bit al unui obiect al variabilei, este necesar ca un parametru s conin numrul octetului care conine bitul -octet- i altul numrul bitului n cadrul octetului - bit. Considerm octeii numerotai de la 1, octetul aflat la adresa cea mai mic, la n, octetul aflat la adresa cea mai mare. Biii unui octet i considerm numerotai de la 0 la 7, unde bitul 0 este bitul cel mai puin semnificativ.

Iat antetul: procedure Mod_bit(adr_var:pointer;lungime,octet, bit, valoare:byte); Cit_bit. Trebuie s cunoatem variabila care conine bitul, octetul i indicele bitului, la fel ca anterior. Subprogramul trebuie s returneze 0 sau 1. function Cit_bit(var nume;lungime,octet,bit:byte):byte;

3
www.ls-infomat.ro | www.manuale-de-informatica.ro

Este indicat ca dup aceast etap s purtm o discuie cu beneficiarul. Poate acesta dorete i altceva sau poate nu este mulumit de modul n care am gndit pn acum.

Etapa 3. Realizarea programelor (subprogramelor)


Primul subprogram care trebuie realizat este: function Vidaj(var nume;lungime:byte):string; Dac analizm antetul, apare o ntrebare: care este tipul primei variabile? Este un caz pe care nu l-am nvat, pentru c transmitem un parametru fr tip. Ce bine ar fi dac n practic n-ar trebui s aplicm dect cuntinele dobndite n coal (facultate) ... n realitate trebuie s nvm s ne autodocumentm... Apelm la help-ul mediului. Cuvntul cheie dup care se face cutarea este parameters. Pe lng modalitile deja cunoscute, ntlnim i forma: var identifier, identifier { list of untyped variable parameters } Oare ce semnificaie are? Dac nu avem o carte la dispoziie care s trateze exact ce avem nevoie, i aa se ntmpl de cele mai multe ori, suntem nevoii s efectum anumite teste ca s ne lmurim. Nu ne propunem n acest moment s efectum testele menionate. Reinei: c pentru un parametru formal fr tip, se depune automat valoarea sa n stiv (deci este sarcina programatorului s-l extrag de acolo utiliznd pointeri). Acest lucru este posibil, pentru c se cunoate numrul de octei pe care-i ocup. n concluzie, n stiv avem: valoarea lungime

Funcia trebuie s returneze un ir care conine valoarea n hexa. Variabilei locale adresa, de tip PChar i se atribuie adresa variabilei nume -adresa din stiv, evident. n acest fel avem adresa primului octet al variabilei. Dup cum am nvat, unei variabile de tip PChar i se poate aduna 1, obinnd astfel adresa urmtorului octet. Acum fiecare octet al variabilei tramsmise, este listat n hexa. Pentru a folosi operatorii div i mod - cu ajutorul crora pot extrage coninutul primilor 4 bii i a ultimilor 4 bii ai octetului - adresa este transformat ca una de tip pointer ctre variabile de tip byte.

4
www.ls-infomat.ro | www.manuale-de-informatica.ro

Iat funcia:
function Vidaj(var nume;lungime:byte):string; var adresa:PChar; man:pointer; man1:string[1]; adr_byte:^byte; i:byte; sir:string; begin {sirul de retur, initial vid} sir:=''; { adresa variabilei care se converteste in hexa} adresa:=@nume; {pentru fiecare octet al variabilei} for i:=1 to lungime do begin man:=adresa; adr_byte:=man; {primii 4 biti} case adr_byte^ div 16 of 0..9: begin str(adr_byte^ div 16,man1); sir:=sir+man1 end; 10: sir:=sir+'A'; 11: sir:=sir+'B'; 12: sir:=sir+'C'; 13: sir:=sir+'D'; 14: sir:=sir+'E'; 15: sir:=sir+'F'; end; {case} {urmatorii 4 biti} case adr_byte^ mod 16 of 0..9: begin str(adr_byte^ mod 16,man1); sir:=sir+man1 end; 10: sir:=sir+'A'; 11: sir:=sir+'B'; 12: sir:=sir+'C'; 13: sir:=sir+'D'; 14: sir:=sir+'E'; 15: sir:=sir+'F'; end; {case} adresa:=adresa+1; {octetii sunt separati prin blank-uri} sir:=sir+' '; end; {returnez sirul} Vidaj:=sir; end;

5
www.ls-infomat.ro | www.manuale-de-informatica.ro

Al doilea subprogram care trebuie realizat este: procedure Mod_bit(adr_var:pointer;lungime,octet, bit, valoare:byte); Presupun c n acest moment este clar modul n care accesm un anumit octet prin utilizarea pointerilor. S analizm mecanismul prin care, fiind dat un anumit octet prin adresa sa, de tip ^byte, putem face ca un anumit bit al su, identificat prin numr de ordine, s ia o anumit valoare. Iniial o variabil de tip byte, va reine 1 pe poziia care trebuie modificat i 0 n rest. n programare, o astfel de variabil se numete masc. De exemplu, dac dorim ca bitul 3 s ia o anumit valoare masca este: 00001000 -biii sunt numerotai de la 0 la 7, bitul cel mai puin semnificativ este bitul 0. dac vrem ca bitul marcat s rein 0, se efectueaz urmtoarele: a) se inverseaz coninutul biilor -cei care rein 0 vor reine 1 i invers. Masca din exemplu devine: 11110111 (operatorul not) b) Se efectueaz i logic ntre masc i octetul care trebuie modificat. In acest fel bitul cruia n masc i corespunde 0, va fi 0, iar restul rmn nemodificai. dac vrem ca bitul marcat s rein 1, atunci se efectueaz sau logic ntre masca nemodificat i octetul al crui bit trebuie modificat. Iat subprogramul:
procedure Mod_bit(adr_var:pointer;lungime,octet,bit,valoare:byte); var adresa:PChar; man:pointer; adr_byte:^byte; masca:byte; begin {adresa primului octert} adresa:=adr_var; {adresa octetuluio care trebuie modificat} adresa:=adresa+octet-1; {conversie catre ^byte} man:=adresa;adr_byte:=man; {construiesc masca} masca:=1; masca:=masca shl bit; if valoare=0 then {daca devine 0} begin masca:=not masca;adr_byte^:=adr_byte^ and masca; end {daca devine 1} else adr_byte^:=adr_byte^ or masca; end;

6
www.ls-infomat.ro | www.manuale-de-informatica.ro

Iat i al treilea subprogram, de tip funcie, are rolul de a returna valoarea memorat de un bit.
function Cit_bit(var nume;lungime,octet,bit:byte):byte; var Adresa:PChar; Man:pointer; Adr_byte:^byte; Masca:byte; begin {Retin adresa} Adresa:=@nume; {obtin adresa octetului care trebuie citit} Adresa:=Adresa+octet-1 ; Man:=Adresa;Adr_byte:=Man; {construiesc masca} Masca:=1; Masca:=masca shl bit; {testez bitul [i returnez valoarea cautata} if Masca and Adr_byte^<>0 then Cit_bit:=1 else Cit_bit:=0; end;

Observai faptul c subprogramele au fost comentate. Este posibil ca aplicaia s fie dezvoltat de o alt persoan. Ar fi imposibil ca aceasta s se descurce n absena unor comentarii n secvenele scrise de dumneavoastr! La firmele serioase nu se primesc aplicaii necomentate.

Etapa 4. Finalizarea proiectului


Subprogramele au fost scrise. Cum le oferim beneficiarului? Cea mai bun soluie este de a include ntr-o unitate de program. S numim aceast unitate biti:
unit biti; INTERFACE function Vidaj(var nume;lungime:byte):string; procedure Mod_bit(adr_var:pointer;lungime,octet,bit,valoare:byte); function Cit_bit(var nume;lungime,octet,bit:byte):byte; IMPLEMENTATION procedure Mod_bit(adr_var:pointer;lungime,octet,bit,valoare:byte); var adresa:PChar; man:pointer; ............................................. end.

7
www.ls-infomat.ro | www.manuale-de-informatica.ro

Etapa 5. Elaborarea documentaiei


Exist dou tipuri de documentaii pe care trebuie s le elaborai: 1) Documentaia care ajunge la beneficiar 2) Documentaie ctre firma la care suntei angajat 1) Documentaia ctre beneficiar cuprinde: Titlul aplicaiei Prezentarea aplicaiei; Aici trebuie s fii ateni ca aplicaia s fie prezentat ntr-un mod comercial. Glumind (pentru c aplicaia dat ca exemplu este extrem de simpl) putei scrie: "De acum programatorii Pascal pot rsufla uurai. Prin utlizarea aplicaiei Biti, accesul la nivel de bit nu mai este o problem Un soft performat pentru adevraii profesioniti!". Descrierea funcionalitii programelor (subprogramelor) care o alctuiesc i exemple de utilizare, cum ar fi:
program exemplu; uses biti; var i:integer; begin i:=3; writeln(Vidaj(i, SizeOf(i))); Mod_bit(@i,SizeOf(i),2,4,1); writeln(Vidaj(i, SizeOf(i))); end.

2) Documentaia ctre firm trebuie s cuprind sursele comentate ale programelor, subprogramelor ca, de fapt, orice considerai c poate fi de folos unui coleg care va aduce la zi aplicaia dvs.

8
www.ls-infomat.ro | www.manuale-de-informatica.ro

Exemplu de proiect
Cerin. S se scrie un set de subprograme care permit lucrul cu mulimi de numere naturale ntre 0 i 2039. Etapele 11-2-3 Dup cum observai, mulimile pot avea un numr mai mare de elemente dect cele care se genereaz cu ajutorul tipului set. n plus, tipul set este specific limbajului Pascal. Alte limbaje nu-l conin. Din acest motiv este important s vedem cum se poate lucra cu mulimi i altfel, renunnd la tipul set. Am nvat faptul c o mulime se reine prin vectorul caracteristic. Aplicaiile pe care le-am realizat anul trecut cu ajutorul acestuia, foloseau pentru fiecare element un octet care memora 0 sau 1. n acest fel se aloca memorie inutil, pentru c o valoare 0 sau 1 poate fi reinut de un bit. n acest fel ajungem la ideea de a memora o mulime la nivel de bit. Pentru ca mulimile s poat avea ca elemente numere naturale ntre 0 si 2039 sunt suficieni 255 octei (2040/8). Este necesar s declarm un tip, numit Multime, pentru care orice variabil s ocupe 255 de octei. type Multime=array[1..255]of byte; n acest fel avem posibilitatea s facem declaraii de genul: var A, B: Multime; Pentru a avea acces la bit pentru astfel de variabile, vom folosi aplicaia anterioar. Pentru a putea lucra cu mulimi vom utiliza urmtoarele subprograme: Init(var A multime); Are rolul de a iniializa o variabil de tip Multime. Toi biii vor reine 0, deci variabila reine mulimea vid.
procedure Init(var A:multime); var i:integer; begin for i:=1 to 255 do A[i]:=0; end;

9
www.ls-infomat.ro | www.manuale-de-informatica.ro

function Apartine(n:integer;A:multime):boolean; Testeaz dac elementul n aparine sau nu mulimii i returneaz valoarea boolean corespunztoare. Pentru aceasta se utilizeaz funcia Cit_bit a unitii biti. Atenie! n cadrul unui octet biii sunt memorai invers. function Apartine(n:integer;A:multime):boolean; begin if Cit_bit(A,255,n div 8+1,7-n mod 8)=1 then Apartine:=true else Apartine:=false; end; procedure Adaug(n:integer;var A:multime); Face reuniunea ntre mulimea cu un singur element n i mulimea A. Rezultatul se gsete n A. Trebuie ca bitul corespunztor lui n s fie 1. Pentru aceasta se folosete procedura Mod_bit.
procedure Adaug(n:integer;var A:multime); var Nr_Octet,Nr_Bit:byte; begin Nr_Octet:=n div 8+1; Nr_Bit:=7-n mod 8; Mod_bit(@A,255,Nr_Octet,Nr_bit,1); end;

procedure Reuniune(var C:multime;A,B:multime); Face reuniunea mulimilor A i B, iar rezultatul se va gsi n C.


procedure Reuniune(var C:multime;A,B:multime); var i:integer; begin for i:=1 to 255 do C[i]:=A[i] or B[i] end;

procedure Intersectie(var C:multime;A,B:multime);

Face intersecia mulimilor A i B, iar rezultatul se va gsi n C.


procedure Intersectie(var C:multime;A,B:multime); var i:integer; begin for i:=1 to 255 do C[i]:=A[i] and B[i] end;

10
www.ls-infomat.ro | www.manuale-de-informatica.ro

procedure Diferenta(var C:multime;A,B:multime); Calculeaz diferena ntre mulimile A i B, iar rezultatul se gsete n C.
procedure Diferenta(var C:multime;A,B:multime); var i:integer; begin for i:=1 to 255 do C[i]:=A[i] and (A[i] XOR b[I]); end;

Subprogramele scrise nu necesit comentarii. Sunt att de simple... Etapa 4. Finalizarea aplica aplicaiei Toate subprogramele le trecem n unitatea de program Multimi. n continuare, prezentm dou aplicaii ale lor. A) Se citesc n numere naturale mai mici ca 2000. Se cere s se tipreasc fiecare numr o singur dat. Problema este clasic. Se rezolv prin utilizarea tipului Multime. O mulime iniial vid este reunit, pe rnd, cu fiecare numr citit. Evident c n cazul n care un numr este citit de dou ori, n mulime nu apare dect o dat. n final, se listeaz mulimea. Spre deosebire de lucrul cu tipul set -din pascal, mecanismul propus este avantajos, pentru c mulimea poate conine mai multe elemente.
program test1; uses multimi; var A:Multime; n,i,man:integer; begin Init(A); write('n=');readln(n); for i:=1 to n do if man<255*8-1 then begin Read(man); Adaug(man,A); end; writeln('Tiparesc'); for i:=1 to 255*8-1 do if Apartine(i,A) then Writeln(i); end.

11
www.ls-infomat.ro | www.manuale-de-informatica.ro

B) La fel ca la problema anterioar, numai c se citesc litere. Din analiza modului de lucru cu mulimi propus, comparativ cu cel prezentat de tipul set, apare un dezavantaj. El este dat de faptul c putem lucra doar cu numere, nu cu tipuri ordinale ca n cazul tipului set. Aa s fie? Oare nu putem lucra i acum cu orice tip ordinal? Rspunsul este afirmativ. Pentru tipurile ordinale care nu au numr de elemente mai mare ca 2540 se poate memora codul, ca orice numr. Funcia ord returneaz codul. La afiarea mulimii apar anumite probleme. Avem codul, cum obinem valoarea? S lum cazul variabilelor de tip char, ca n exemplul urmtor. Pentru un caracter se memoreaz codul su. De fapt, se pune problema ca variabila de tip char s rein numrul citit din procedur. O atribuire direct nu este permis. Dar dac cunoatem pointeri, nu trebuie s ne facem probleme. Efectum atribuirea, "paclind" limbajul. O adres va reine valoarea numeric ce trebuie transferat. Aceasta este convertit ctre tipul pointer, apoi ctre tipul char^. Urmeaz atribuirea... Verificai programul urmtor:
program P2; uses multimi; var A:Multime; n,i:integer; man:char; adr_gen:pointer; adr_char:^char; adr_byte:^byte; begin write('n=');readln(n); for i:=1 to n do begin Read(man); Adaug(ord(man),A); readln end; writeln('Tiparesc'); for i:=0 to 255*8-1 do if Apartine(i,A) then begin adr_byte:=@i; adr_gen:=adr_byte; adr_char:=adr_gen; man:=adr_char^; writeln(man); end end.

12
www.ls-infomat.ro | www.manuale-de-informatica.ro

Teme propuse
Urmtoarele teme se vor elabora de ctre grupe de elevi, respectndu-se etapele de elaboarare a unei aplicaii. Elevii vor preda programele (subprogramele), documentaia ctre "firm" i cea ctre beneficiar. De asemenea, elevii pot propune teme pe care apoi s le finalizeze. Orice grup de elevi este alctuit din: a) b) c) d) 1 analist (de preferin elev cu not mare la matematic); 1-2 programatori; 1 "tester" - elev care are rolul de a testa aplicaia; 1 tehnoredactor.

Temele sunt cele de mai jos: 1. Set de rutine pentru lucrul cu numerele complexe. 2. Set de rutine pentru lucrul cu numere raionale. 3. Set de rutine pentru lucrul cu liste dublu nlnuite. 4. Ansamblu de programe care permit s se in pe calculator evidena ntreinerii la un bloc cu mai multe scri. 5. Ansamblu de programe care permit s se in evidena elevilor dintr-un liceu.

13
www.ls-infomat.ro | www.manuale-de-informatica.ro