Sunteți pe pagina 1din 45

GRUP SCOLAR LUCIAN BLAGA REGHIN

Coordonator: Prof. Cazan Minodora Autor: Moldovan Aurelian-Ionut

- 2009 CUPRINS
1)

Introducere-Argumentarea temei alese 3

2) Turnurile din Hanoi. 4 3) Ce trateaza lucrarea. 5 4) Descrierea programului si a unit-urilor folosite.. 5 5) Program 6

ARGUMENTAREA TEMEI ALESE Am ales aceasta tema datorita importantei pe care o are aceasta tehnica de programare, dar si pentru ca Turnurile din Hanoi era unul din jocurile mele preferate in copilarie. Divide et impera se bazeaz pe principiul descompunerii problemei n dou sau mai multe subprobleme (mai uoare), care se rezolv, iar soluia pentru problema iniial se obine combinnd soluiile subproblemelor. De multe ori, subproblemele sunt de acelai tip i pentru fiecare din ele se poate aplica aceeai tactic a descompunerii n (alte) subprobleme, pn cnd (n urma descompunerilor repetate) se ajunge la probleme care admit rezolvare imediat. Nu toate problemele pot fi rezolvate prin utilizarea acestei tehnici. Se poate afirma c numrul celor rezolvabile prin "divide et impera" este relativ mic, tocmai datorit cerinei ca problema s admit o descompunere repetat. Divide et impera este o tehnic ce admite o implementarea recursive. Principiul general prin care se elaboreaz algoritmi recursivi este: "ce se ntmpl la un nivel, se ntmpl la orice nivel" (avnd grij s asigurm condiiile de terminare). Aadar, un algoritm prin divide et impera se elaboreaz astfel: la un anumit nivel avem dou posibiliti: s-a ajuns la o problem care admite o rezolvare imediat (condiia de terminare), caz n care se rezolv i se revine din apel; nu s-a ajuns n situaia de la punctul 1, caz n care problema curent este descompus n (dou sau mai multe) subprobleme, pentru fiecare din ele urmeaz un apel recursiv al funciei, dup care combinarea rezultatelor are loc fie pentru fiecare subproblem, fie la final, naintea revnirii din apel.

TURNURILE DIN HANOI

Se spune ca intr-un templu din Benares(India) preotii lucreaza incontinuu, mutand discuri de aur de pe un ac de diamante pe altul. Atunci cand lumea a fost create, preotilor din Benares le-au fost daruite 3 ace de diamante si 64 discuri de aur. Preotilor li s-a poruncit sa depuna pe unul din ace toate discurile, in ordine descrescatoare, apoi sa mute intregul turn astfel format pe unul din celelalte doua ace, mutand cate un disc o data si fara a pune un disc mai mare peste unul mai mic. In conformitate cu legenda Dumnezeu le-a zis oamenilor:cand veti termina de mutat turnul, atunci lumea se va sfarsi! Jocul Turnurile din Hanoi( uneori numit si turnurile din Brahma ) a fost inventat de matematicianul francez Edouard Lucas, in 1883. el s-a inspirit din legenda unui templu hindus care folosea un astfel de joc pentru disciplina mentala a tinerilor calugari. Regulile jocului sunt simple: la o mutare se deplaseaza un singur disc

un disc mai mare nu poate fi pus peste un disc mai mic

CE TRATEAZA LUCRAREA Lucrarea Metoda Divide et Impera prezinta metoda si exemple in care se foloseste ea. Programul se lanseaza in executie prin fisierul Di.exe. Primul ecran prezinta titlul lucrarii numele autorului si pe cel al coordonatorului, al doilea ecran prezinta cuprinsul acesteia. Trecerea de la un ecran la urmatorul se face prin tastarea Enter. Din Cuprins se pot alege cu ajutorul mouse-ului urmatoarele optiuni: Metoda Divide et Impera.Exemplu. -> contine un ecran ce contine o scurta descriere a metodei si un exemplu animat. Turnurile din Hanoi cu trei optiuni::Enuntul problemei-un ecran in care este descrisa problema,Animatie pentru n discuri 4 ecrane in care este prezentata animat mutarea discurilor pe tije,Program-un ecran cu descrierea programului. Cautare binara cu doua optiuni:Enunt si exemplu animat-un ecran in care este enuntul unei probleme si un exemplu animat,Program-un ecran cu programul. Iesirea din fiecare meniu se face prin tastarea Enter, iar trecerea de la un ecran la altul in cazul meniurilor cu doua ecrane se face tot prin tastarea Enter. Iesirea din program se face actionand butonul Iesire. DESCRIEREA PROGRAMULUI SI A UNIT-URILOR FOLOSITE

Programul principal se numeste di.pas. El apeleaza unit-urile limbajului: Crt, Graph si unit-urile aditionale di_Mouse, di_ex,di_anim,di_ecran. Initializarea modului de lucru grafic se face cu ajutorul procedurii InitGraph, iar lucrul cu mouse-ul necesita variabilele found, button, clicks. Dupa initializarea modului grafic si pregatirea mediului, se apeleaza procedura Ecran1 ce prezinta prima pagina a programului si procedura ecran2 care afiseaza cuprinsul Unit-ul di_Mouse contine procedurile si functiile necesare lucrului cu mouse-ul. Unit-ul di_ex are procedurile:ex1,ex2,ex3 si ex4 Care descriu cele 4 exemple de la turnirile din Hanoi.

Unit-ul di_anim -are procedurile pop_titlu, titlu, pop, sterg,d1..d4,tc,ta,tije,buton,cuprinscare realizeaza animatia. Unit-ul di_ecran-are 6 ecrane: Ecranul1prezinta titlul lucrarii, autorul si profesorul coordonator. Ecranul2prezinta cuprinsul Ecranul3prezinta turnurile din Hanoi.Enunt Ecran4prezinta programul de la turnuri. Ecran5teoria referitoare la Cautare Binara:enunt si exemplu animat. Ecran6programul pentru cautare binara. PROGRAM DIVIDE ET IMPERA Uses graph, crt, di_anim, di_ex, di_mouse, di_ecran; Var found:boolean; buttons, clicks,x,y:integer; Procedure InitGr; Var gd, gm:integer; begin gd:=detect; InitGraph(gd,gm,' '); If GraphResult<>grOK then begin writeln('Nu se poate face initializarea'); Readln; Halt(1) end; ClearDevice; end; begin

initgr; cleardevice; ecran1; cleardevice; cuprins; resetmouse(found,buttons); if not found then begin clrscr; writeln('Mouse-ul nu este instalat!!!'); readln; exit end; defgraphlocator(arrow); setmouse(50,50); defsensitivity(16,16); showlocator; buton(195,145,460,160,10); buton(245,205,390,220,10); buton(245,265,275,280,10); buton(310,265,340,280,10); buton(380,265,415,280,10); buton(450,265,485,280,10); buton(245,295,310,310,10); buton(245,355,440,370,10); buton(245,385,310,400,10); buton(195,425,255,440,10); repeat setcolor(14);

outtextxy(200,150,'METODA DIVIDE ET IMPERA. EXEMPLU'); setcolor(15); outtextxy(200,180,'TURNURILE DIN HANOI'); setcolor(14); outtextxy(250,210,'Enuntul problemei'); setcolor(15); outtextxy(250,240,'Animatie pentru n discuri'); setcolor(14); outtextxy(250,270,'n=1 setcolor(15); outtextxy(200,330,'CAUTARE BINARA'); setcolor(14); outtextxy(250,360,'Enunt si exemplu animat'); outtextxy(250,390,'Program'); outtextxy(200,430,'IESIRE'); buttons:=1; ClickNumber(buttons,clicks,x,y); if (x>195) and (x<460) and (y>145) and (y<160) then begin buton(195,145,460,160,13); if (clicks=1) or (clicks=2) then begin HideLocator; ecran2; SetMouse(50,50); ShowLocator end end else n=2 n=3 n=4'); outtextxy(250,300,'Program');

buton(195,145,460,160,10); if (x>245) and (x<390) and (y>205) and (y<220) then begin buton(245,205,390,220,13); if (clicks=1) or (clicks=2) then begin HideLocator; ecran3; SetMouse(50,50); ShowLocator end end else buton(245,205,390,220,10); if (x>245) and (x<275) and (y>265) and (y<280) then begin buton(245,265,275,280,13); if (clicks=1) or (clicks=2) then begin HideLocator; ex1; SetMouse(50,50); ShowLocator end end else buton(245,265,275,280,10); if (x>310) and (x<340) and (y>265) and (y<280) then begin

buton(310,265,340,280,13); if (clicks=1) or (clicks=2) then begin HideLocator; ex2; SetMouse(50,50); ShowLocator end end else buton(310,265,340,280,10); if (x>380) and (x<415) and (y>265) and (y<280) then begin buton(380,265,415,280,13); if (clicks=1) or (clicks=2) then begin HideLocator; ex3; SetMouse(50,50); ShowLocator end end else buton(380,265,415,280,10); if (x>450) and (x<485) and (y>265) and (y<280) then begin buton(450,265,485,280,13); if (clicks=1) or (clicks=2) then begin HideLocator;

10

ex4; SetMouse(50,50); ShowLocator end end else buton(450,265,485,280,10); if (x>245) and (x<310) and (y>295) and (y<310) then begin buton(245,295,310,310,13); if (clicks=1) or (clicks=2) then begin HideLocator; ecran4; SetMouse(50,50); ShowLocator end end else buton(245,295,310,310,10); if (x>245) and (x<440) and (y>355) and (y<370) then begin buton(245,355,440,370,13); if (clicks=1) or (clicks=2) then begin HideLocator; ecran5; SetMouse(50,50); ShowLocator end

11

end else buton(245,355,440,370,10); if (x>245) and (x<310) and (y>385) and (y<400) then begin buton(245,385,310,400,13); if (clicks=1) or (clicks=2) then begin HideLocator; ecran6; SetMouse(50,50); ShowLocator end end else buton(245,385,310,400,10); if (x>195) and (x<255) and (y>425) and (y<440) then begin buton(195,425,255,440,13); if (clicks=1) or (clicks=2) then Exit end else buton(195,425,255,440,10); until buttons=2; readln; end.

12

Unit Di_anim; Interface Uses Graph, Crt; procedure pop_titlu(x,y:integer; text:string; cul:word); procedure titlu(x,y:integer; text:string; cul:word); procedure pop(x,y:integer; text:string; cul:word); procedure blink(x,y:integer; text:string; cul:word); procedure sterg(x,y:integer; text:string); procedure unire(xi,xf,y:integer; cul:word); procedure d1(x,y:integer); procedure d2(x,y:integer); procedure d3(x,y:integer); procedure d4(x,y:integer); procedure ta; procedure tb; procedure tc; procedure tije; procedure s1(x,y:integer); procedure s2(x,y:integer); procedure s3(x,y:integer); procedure s4(x,y:integer); procedure cuprins; procedure buton(xi,yi,xf,yf:integer; cul:word);

Implementation procedure pop_titlu(x,y:integer; text:string; cul:word);

13

begin settextstyle(0,0,2); setcolor(cul); outtextxy(x,y,text); delay(300); end; procedure titlu(x,y:integer; text:string; cul:word); var i:integer; begin for i:=10 to 15 do pop_titlu(x,y,text,i); pop_titlu(x,y,text,cul); settextstyle(0,0,1); end; procedure pop(x,y:integer; text:string; cul:word); begin setcolor(cul); outtextxy(x,y,text); delay(300); end; procedure sterg(x,y:integer; text:string); begin setcolor(0); outtextxy(x,y,text); delay(300); end; procedure blink(x,y:integer; text:string; cul:word); var i:integer;

14

begin for i:=10 to 15 do pop(x,y,text,i); pop(x,y,text,cul); end; procedure unire(xi,xf,y:integer; cul:word); begin setcolor(cul); line(xi,y,xi,y+10); line(xi,y+10,xf,y+10); line(xf,y+10,xf,y); end; procedure d1(x,y:integer); begin setfillstyle(1,9); bar(x,y,x+80,y+20); delay(300); end; procedure d2(x,y:integer); begin setfillstyle(1,13); bar(x,y,x+60,y+20); delay(300); end; procedure d3(x,y:integer); begin setfillstyle(1,12); bar(x,y,x+40,y+20);

15

delay(300); end; procedure d4(x,y:integer); begin setfillstyle(1,11); bar(x,y,x+20,y+20); delay(300); end; procedure ta; begin setcolor(15); line(120,180,120,300); setlinestyle(0,0,3); line(70,300,170,300); setlinestyle(0,0,1); delay(300); end; procedure tb; begin setcolor(15); line(320,180,320,300); setlinestyle(0,0,3); line(270,300,370,300); setlinestyle(0,0,1); delay(300); end; procedure tc; begin

16

setcolor(15); line(520,180,520,300); setlinestyle(0,0,3); line(470,300,570,300); setlinestyle(0,0,1); delay(300); end; procedure s1(x,y:integer); begin setfillstyle(1,0); bar(x,y,x+80,y+20); end; procedure s2(x,y:integer); begin setfillstyle(1,0); bar(x,y,x+60,y+20); end; procedure s3(x,y:integer); begin setfillstyle(1,0); bar(x,y,x+40,y+20); end; procedure s4(x,y:integer); begin setfillstyle(1,0); bar(x,y,x+20,y+20); end;

17

procedure cuprins; begin cleardevice; titlu(250,80,'CUPRINS',10); blink(200,150,'METODA DIVIDE ET IMPERA. EXEMPLU',14); blink(200,180,'TURNURILE DIN HANOI',15); blink(250,210,'Enuntul problemei',14); blink(250,240,'Animatie pentru n discuri',15); blink(250,270,'n=1 n=2 n=3 n=4',14); blink(250,300,'Program',14); blink(200,330,'CAUTARE BINARA',15); blink(250,360,'Enunt si exemplu animat',14); blink(250,390,'Program',14); blink(200,430,'IESIRE',14); end; procedure tije; begin ta; tb; tc; pop(115,320,'A',15); pop(315,320,'B',15); pop(515,320,'C',15); end; procedure buton(xi,yi,xf,yf:integer; cul:word); begin setcolor(cul); rectangle(xi,yi,xf,yf); end;

18

begin end.

unit di_ecran; interface uses crt, graph, di_anim, di_ex; procedure ecran1; procedure ecran2; procedure ecran3; procedure ecran4; procedure ecran5; procedure ecran6;

Implementation procedure ecran1; begin cleardevice; titlu(180,120,'PROBLEME REZOLVATE',10); titlu(180,150,' prin metoda',14); titlu(180,180,' DIVIDE ET IMPERA',13); pop(200,270,'Lucrare de atestat realizata de:',15); titlu(180,290,' Moldovan Adela Liana ,9); pop(200,320,' sub indrumarea prof.',15);

19

titlu(180,340,'Cazan Minodora,10); readln; cleardevice; end; procedure ecran2; begin cleardevice; titlu(130,100,'METODA DIVIDE ET IMPERA',10); blink(50,160,'Definitie:',14); pop(50,175,'Metoda Divide et Impera imparte probleme initiala in doua sau mai multe ',15); pop(30,190,'probleme ce pot fi rezolvate (eventual printr-o noua descompunere), rezulta-',15); pop(30,205,'tul final obtinandu-se prin combinarea solutiilor acestora',15); blink(50,230,'Exemplu:',14); blink(50,230,' pop(50,260,'2',10); pop(80,260,'3',10); pop(110,260,'-2',10); pop(150,260,'6',10); pop(180,260,'8',10); pop(210,260,'7',10); pop(240,260,'-3',10); pop(300,260,'Putem determina minimul in mod direct doar',15); pop(280,275,'daca sirul are unul sau doua elemente.',15); pop(280,290,'Descompunerea problemei consta in impartirea',15); Determinarea minimului dintr-un sir de n elemente',14); pop(50,245,'fie sirul:',15);

20

pop(280,305,'sirului in doua, apoi fiecare subsir obtinut ',15); pop(280,320,'se imparte si el pana cand obtinem subsiruri',15); pop(280,335,'de maximum doua elemente.',15); pop(300,350,'Apasati Enter pentru animatie!',13); readln; setcolor(11); line(167,257,167,320); delay(500); setcolor(14); line(97,257,97,290); delay(500); line(227,257,227,290); delay(500); sterg(300,350,'Apasati Enter pentru animatie!'); pop(300,350,'Pentru fiecare subsir obtinut se determina',15); pop(280,365,'minimul, apoi minimele partiale se compara',15); pop(280,380,'doua cate doua, dand in final minimul sirului.',15); pop(300,395,'Apasati Enter pentru animatie!',13); readln; sterg(300,395,'Apasati Enter pentru animatie!'); unire(52,82,270,15); delay(500); pop(65,290,'2',14); unire(112,152,270,15); delay(500); pop(125,290,'-2',14); unire(182,212,270,15); delay(500); pop(195,290,'7',14); unire(234,254,270,15);

21

delay(500); pop(240,290,'-3',14); unire(67,127,300,15); delay(500); pop(92,320,'-2',11); unire(197,242,300,15); delay(500); pop(220,320,'-3',11); unire(97,223,330,15); delay(500); pop(155,350,'-3',10); pop(30,395,'Exemplul are doar functie didactica, metoda nefiind eficienta in acest caz!',10); pop(150,430,'Apasati Enter pentru intoarcerea la Cuprins!',13); readln; cleardevice; cuprins; end; procedure ecran3; begin cleardevice; titlu(80,100,'TURNURILE DIN HANOI - Enunt',10); pop(50,160,'Se dau trei tije A, B, C. Pe tija A se gasesc n discuri de diametre dife-',15); pop(30,175,'rite asezate crescator de sus in jos. Se cere sa se mute cele n discuri de ',15); pop(30,190,'pe A pe B, stiind ca:',15); pop(30,205,'1) se poate muta doar un singur disc la un moment dat.',15);

22

pop(30,220,'2) nu se poate aseza un disc mai mare peste unul mai mic.',15); pop(30,235,'3) se poate folosi tija C ca intermediar.',15); blink(50,260,'Algoritm:',10); pop(50,275,'Mutarea a n discuri de pe A pe B insemna:',15); pop(30,290,'- mutarea a n-1 discuri de pe A pe C utilizand ca intermediar pe B;',15); pop(30,305,'- mutarea discului mare de pe A pe B, mutare directa;',15); pop(30,320,'- mutarea a n-1 discuri de pe C pe B utilizand pe A ca intermediar.',15); pop(50,335,'Cazul in care putem avea o mutare directa este pentru un singur disc.',14); blink(50,360,'Forma generala:',10); pop(50,390,'H(n,A,B,C)=',15); pop(50,375,' pop(50,405,' AB daca n=1;',15); H(n-1,A,C,B), AB, H(n-1,C,B,A) daca n>1;',15);

line(150,373,150,415); pop(150,440,'Apasati Enter pentru intoarcerea la Cuprins!',13); readln; cleardevice; cuprins; end; procedure ecran4; begin cleardevice; titlu(80,100,'TURNURILE DIN HANOI - Program',10); pop(50,160,'Program Hanoi;',15); pop(50,175,'var A, B, C: char;',15); pop(50,190,' n: integer;',15); pop(50,205,'procedure H(n:integer; A, B, C:char);',15); pop(50,220,'begin',15);

23

pop(50,235,' pop(50,250,' pop(50,265,' pop(50,280,' pop(50,295,' pop(50,310,'

if n=1 then writeln(A,B)',15); else begin',15); H(n-1,A,C,B);',15); writeln(A,B);',15); H(n-1,C,B,A);',15); end;',15);

pop(50,325,'end;',15); pop(50,340,'begin {program principal}',15); pop(50,355,' pop(50,370,' pop(50,385,' pop(50,400,' pop(50,415,' write('+''''+'n='+''''+'); readln(n);',15); A:='+''''+'A'+''''+';',15); B:='+''''+'B'+''''+';',15); C:='+''''+'C'+''''+';',15); H(n,A,B,C);',15);

pop(50,430,'end.',15); pop(150,445,'Apasati Enter pentru intoarcerea la Cuprins!',13); readln; cleardevice; cuprins; end; procedure ecran5; begin cleardevice; titlu(200,100,'CAUTARE BINARA',10); blink(50,180,'Enunt:',13); pop(50,195,'Fie un sir de n numere intregi ordonat crescator. Dandu-se un numar nr de',14); pop(30,210,'la tastatura, se cere sa se caute numarul in sir si daca este gasit sa se ',14); pop(30,225,'afiseze pozitia acestuia. Daca nu este gasit, sa se afiseze un mesaj.',14); blink(50,250,'Ex:',13);

24

pop(50,265,'Consideram sirul A de mai jos, unde n=7',14); blink(50,280,'2',15); blink(80,280,'5',15); blink(110,280,'7',15); blink(140,280,'8',15); blink(170,280,'9',15); blink(200,280,'11',15); blink(230,280,'23',15); pop(50,300,'Sa cautam un numar care se gaseste in sir: nr=5',14); pop(30,315,'- se ia elementul din mijloc',15); delay(100); blink(140,280,'8',10); delay(100); pop(30,330,'- se verifica daca acesta este numarul cautat. In cazul nostru NU',15); delay(100); pop(30,345,'- se compara nr de cautat cu elementul din mijloc. La noi 5<8',15); delay(100); pop(30,360,'- vom continua cautarea in subsirul din stanga, ce contine nr<8',15); delay(100); blink(80,280,'5',13); delay(100); pop(30,375,'- se verifica daca acesta este numarul cautat. In cazul nostru DA',15); delay(100); pop(30,390,'- afisam indicele numarului din sir. La noi i=2',15); pop(200,405,'Apasati Enter pentru exemplul urmator!',13); readln; sterg(50,300,'Sa cautam un numar care se gaseste in sir: nr=5'); sterg(30,315,'- se ia elementul din mijloc'); sterg(30,330,'- se verifica daca acesta este numarul cautat. In cazul nostru NU');

25

sterg(30,345,'- se compara nr de cautat cu elementul din mijloc. La noi 5<8'); sterg(30,360,'- vom continua cautarea in subsirul din stanga, ce contine nr<8'); sterg(30,375,'- se verifica daca acesta este numarul cautat. In cazul nostru DA'); sterg(30,390,'- afisam indicele numarului din sir. La noi i=2'); sterg(200,405,'Apasati Enter pentru exemplul urmator!'); setcolor(15); outtextxy(80,280,'5'); outtextxy(140,280,'8'); pop(50,300,'Sa cautam acum un numar care nu exista in sir: nr=10',14); pop(30,315,'- se ia elementul din mijloc',15); blink(140,280,'8',10); delay(100); pop(30,330,'- se verifica daca este nr. cautat. In cazul nostru NU',15); pop(30,345,'- se compara cu numarul din mijloc, in cazul nostru vom continua pentru',15); pop(30,360,'subsirul din dreapta (8<10)',15); blink(200,280,'11',10); delay(100); pop(30,375,'- se verifica daca este nr. cautat. In cazul nostru NU',15); pop(30,390,'- se compara cu numarul din mijloc, in cazul nostru vom continua pentru',15); pop(30,405,'subsirul din stanga (11>10)',15); blink(170,280,'9',10); delay(100); pop(30,420,'- nici acesta nu este nr. cautat, ar trebui sa cautam in dreapta, dar',15); pop(30,435,'nu mai sunt elemente. Deci, nr. nu se gaseste in sir',14); pop(200,455,'Apasati Enter pentru intoarcerea la Cuprins!',13); readln; cleardevice; cuprins;

26

end; procedure ecran6; begin cleardevice; titlu(100,100,'PROGRAM PENTRU CAUTAREA BINARA',10); pop(30,150,'Program cautare;',15); pop(30,165,'var v:array[1..100] of integer;',15); pop(30,180,' pop(30,195,' i,n,nr:integer;',15); gasit:boolean;',15);

pop(30,210,'procedure caut(ls,ld:integer; var gasit:boolean);',15); pop(30,225,'begin',15); pop(30,240,'if nr=v[(ls+ld) div 2] then begin',15); pop(30,255,' pop(30,270,' pop(30,285,' pop(30,315,' pop(30,330,' pop(30,345,' pop(30,360,'end;',15); pop(200,400,'Apasati Enter pentru continuarea programului!',13); readln; cleardevice; titlu(100,100,'PROGRAM PENTRU CAUTAREA BINARA',10); pop(30,150,'Begin {pp}',15); pop(30,165,' pop(30,180,' pop(30,195,' write('+''''+'n='+''''+'); readln(n);',15); for i:=1 to n do',15); begin',15); writeln('+''''+'pozitia'+''''+',(ls+ld) div 2',15); gasit:=true;',15); end;',15); then if nr<v[(ls+ld) div 2] then',15); caut(ls, ((ls+ld) div 2) - 1), gasit',15); else caut(((ls+ld) div 2) + 1),ld,gasit);',15);

pop(30,300,'else if ls<ld {mai am elemente in sir}',15);

27

pop(30,210,' pop(30,225,' pop(30,240,' pop(30,255,' pop(30,270,' pop(30,285,' pop(30,300,'

write('+''''+'elementul'+''''+',i,'+''''+'este:'+''''+');',15); readln(v[i]);',15); end;',15); gasit:=false',15); caut(1,n,gasit);',15); if not gasit then',15); writeln('+''''+'Numarul nu se gaseste in sir'+''''+');',15);

pop(30,315,'readln;',15); pop(30,330,'end.',15); readln; cleardevice; cuprins; end; begin end.

Unit DI_ex;

Interface uses crt, graph, di_anim; procedure ex1; procedure ex2; procedure ex3; procedure ex4;

28

Implementation procedure ex1; begin cleardevice; titlu(180,100,'Exemplu pentru n=1',10); tije; d1(80,280); pop(100,360,'Initial avem un singur disc pe tija A',14); pop(100,375,'Apasati Enter pentru animatie!',10); readln; sterg(100,360,'Initial avem un singur disc pe tija A'); sterg(100,375,'Apasati Enter pentru animatie!'); s1(80,280); ta; d1(280,280); blink(100,390,'Afisez AB',14); pop(150,430,'Apasati Enter pentru intoarcerea la Cuprins!',10); readln; cuprins; end; procedure ex2; begin cleardevice; titlu(180,100,'Exemplu pentru n=2',10); tije; d1(80,280); d2(90,260); pop(100,360,'Initial avem doua discuri pe tija A',14); pop(100,375,'Apasati Enter pentru animatie!',10);

29

readln; sterg(100,360,'Initial avem doua discuri pe tija A'); sterg(100,375,'Apasati Enter pentru animatie!'); s2(90,260); ta; d1(80,280); d2(490,280); blink(100,390,'Afisez AC',14); s1(80,280); ta; d1(280,280); blink(100,390,' s2(490,280); tc; d2(290,260); blink(100,390,' CB',14); AB',14);

pop(150,430,'Apasati Enter pentru intoarcerea la Cuprins!',10); readln; cuprins; end; procedure ex3; begin cleardevice; titlu(180,100,'Exemplu pentru n=3',10); tije; d1(80,280); d2(90,260); d3(100,240); pop(100,360,'Initial avem trei discuri pe tija A',14); pop(100,375,'Apasati Enter pentru animatie!',10);

30

readln; sterg(100,360,'Initial avem trei discuri pe tija A'); sterg(100,375,'Apasati Enter pentru animatie!'); s3(100,240); ta; d1(80,280); d2(90,260); d3(300,280); blink(50,390,'Afisez AB',14); s2(90,260); ta; d1(80,280); d2(490,280); blink(50,390,' s3(300,280); tb; d3(500,260); blink(50,390,' s1(80,280); ta; d1(280,280); blink(50,390,' s3(500,260); tc; d2(490,280); d3(100,280); blink(50,390,' s2(490,280); tc; d2(290,260); blink(50,390,' CB',14); CA',14); AB',14); BC',14); AC',14);

31

s3(100,280); ta; d3(300,240); blink(50,390,' AB',14);

pop(150,430,'Apasati Enter pentru intoarcerea la Cuprins!',10); readln; cuprins; end; procedure ex4; begin cleardevice; titlu(180,100,'Exemplu pentru n=4',10); tije; d1(80,280); d2(90,260); d3(100,240); d4(110,220); pop(100,360,'Initial avem patru discuri pe tija A',14); pop(100,375,'Apasati Enter pentru animatie!',10); readln; sterg(100,360,'Initial avem patru discuri pe tija A'); sterg(100,375,'Apasati Enter pentru animatie!'); s4(110,220); ta; d1(80,280); d2(90,260); d3(100,240); d4(510,280);

32

blink(100,390,'Afisez AC',14); s3(100,240); ta; d1(80,280); d2(90,260); d3(300,280); blink(100,390,' s4(510,280); tc; d4(310,260); blink(100,390,' s2(90,260); ta; d1(80,280); d2(490,280); blink(100,390,' s4(310,260); tb; d3(300,280); d4(110,260); blink(100,390,' s3(300,280); tb; d3(500,260); blink(100,390,' s4(110,260); ta; d1(80,280); d4(510,240); blink(100,390,' s1(80,280); ta; AC',14); BC',14); BA',14); AC',14); CB',14); AB',14);

33

d1(280,280); blink(100,390,' s4(510,240); tc; d2(490,280); d3(500,260); d4(310,260); blink(100,390,' s3(500,260); tc; d2(490,280); d3(100,280); blink(100,390,' s4(310,260); tb; d1(280,280); d4(110,260); blink(100,390,' s2(490,280); tc; d2(290,260); blink(100,390,' s4(110,260); ta; d3(100,280); d4(510,280); blink(100,390,' s3(100,280); ta; d3(300,240); blink(100,390,' s4(510,280); AB',14); AC',14); CB',14); BA',14); CA',14); CB',14); AB',14);

34

tc; d4(310,220); blink(100,390,' readln; cuprins; end; begin end. CB',14); pop(150,430,'Apasati Enter pentru intoarcerea la Cuprins!',10);

Unit di_mouse; Interface {$B-,D-,O-,R-,S-,V-} type GraphShapeType = record ScreenMask: array [1..16] of word; CursorMask: array [1..16] of word; XActive, YActive: integer; end; {$I mouse.inc} Const WaitDoubleClick=300; Procedure ClickNumber (var buttons:integer; var clicks, x, y:integer); Procedure DefEvent (Mask:integer; handler:pointer); Procedure DefGraphLocator (var shape:GraphShapeType); Procedure DefSensitivity(DeltaX, DeltaY:integer); Procedure DefTextLocator (StyleFlag:boolean; ScrMask, CursMask:word);

35

Procedure DefXRange (XMin, XMax:integer); Procedure DefYRange (YMin, YMax:integer); Procedure GetButtonPress (var button:integer; var N, x, y:integer); Procedure GetButtonRelease (var button:integer; var N, x, y:integer); Procedure GetMotion (var DeltaX, DeltaY:integer); Procedure GetMouse (var button:integer; var x, y:integer); Procedure HideLocator; Procedure LightPenOff; Procedure LightPenOn; Procedure ResetMouse (var FoundMouse:boolean; var buttons:integer); Procedure RestoreMouseState (buffer:pointer); Procedure SetDoubleSpeed (speed:integer); Procedure SetMouse (x, y:integer); Procedure SetSpecialArea (area:pointer); Procedure ShowLocator; Procedure SwapEvent (var Mask, OldMask:integer; handler:pointer; var OldHandler:pointer); Function MouseStateSize:integer;

Implementation Uses Dos, Crt; type PtrType = record ofs, seg:word; end; Var regs:registers; FoundMouse:boolean; Procedure ResetMouse (var FoundMouse:boolean; var buttons:integer);

36

begin regs.ax:=0; intr($33, regs); buttons:=regs.bx; FoundMouse:=(not regs.ax=0) end; Procedure ShowLocator; begin regs.ax:=1; intr($33, regs); end; Procedure HideLocator; begin regs.ax:=2; intr($33, regs); end; Procedure GetMouse (var button:integer; var x, y:integer); begin regs.ax:=3; intr($33, regs); with regs do begin button:=bx; x:=cx; y:=dx end end; Procedure SetMouse (x, y:integer);

37

begin with regs do begin ax:=4; cx:=x; dx:=y; end; intr($33, regs) end; Procedure GetButtonPress (var button:integer; var N, x, y:integer); begin with regs do begin ax:=5; bx:=button; intr($33, regs); button:=ax; N:=bx; x:=cx; y:=dx end; end; Procedure GetButtonRelease (var button:integer; var N, x, y:integer); begin with regs do begin ax:=6; bx:=button; intr($33, regs); button:=ax;

38

N:=bx; x:=cx; y:=dx; end end; Procedure ClickNumber (var buttons:integer; var clicks, x, y:integer); begin GetMouse (buttons, x, y); if buttons=1 then begin delay (WaitDoubleClick); buttons:=0; GetButtonPress (buttons, clicks, x, y) end else clicks:=0; end; Procedure DefXRange (XMin, XMax:integer); begin with regs do begin ax:=7; cx:=XMin; dx:=XMax end; intr($33, regs) end; Procedure DefYRange (YMin, YMax:integer); begin with regs do

39

begin ax:=8; cx:=YMin; dx:=YMax end; intr($33, regs) end; Procedure DefGraphLocator (var Shape:GraphShapeType); begin with regs, Shape do begin ax:=9; bx:=XActive; cx:=YActive; dx:=ofs(ScreenMask); es:=seg(CursorMask) end; intr($33, regs); end; Procedure DefTextLocator (StyleFlag:boolean; ScrMask, CursMask:word); begin with regs do begin ax:=10; if StyleFlag then bx:=0 else bx:=1; cx:=ScrMask; dx:=CursMask end;

40

intr($33, regs); end; Procedure GetMotion (var DeltaX, DeltaY:integer); begin with regs do begin ax:=11; intr($33, regs); DeltaX:=cx; DeltaY:=dx; end; end; Procedure LightPenOn; begin regs.ax:=13; intr($33, regs); end; Procedure LightPenOff; begin regs.ax:=14; intr($33, regs); end; Procedure DefEvent (Mask:integer; handler:pointer); begin with regs do begin ax:=12; cx:=$01 shl Mask;

41

dx:=PtrType(handler).ofs; es:=PtrType(handler).seg end; intr($33, regs) end; Procedure SwapEvent (var Mask, OldMask:integer; handler:pointer; var OldHandler:pointer); begin with regs do begin ax:=20; cx:=$01 shl Mask; dx:=ofs(handler^); es:=seg(handler^); intr($33, regs); OldMask:=cx; PtrType(handler).ofs:=dx; PtrType(handler).seg:=es end end; Procedure DefSensitivity (DelTAx, DeltaY:integer); begin with regs do begin ax:=15; cx:=DeltaX; dx:=DeltaY end; intr($33, regs) end;

42

Procedure SetSpecialArea (area:pointer); begin with regs do begin ax:=16; es:=PtrType(area).seg; dx:=PtrType(area).ofs end; intr($33, regs) end; Procedure SetDoubleSpeed (speed:integer); begin with regs do begin ax:=19; dx:=speed end; intr($33, regs) end; Function MouseStateSize:integer; begin regs.ax:=21; intr($33, regs); MouseStateSize:=regs.bx end; Procedure SaveMouseState (buffer:pointer); begin with regs do

43

begin ax:=22; es:=PtrType(buffer).seg; dx:=PtrType(buffer).ofs; end; intr($33, regs); end; Procedure RestoreMouseState (buffer:pointer); begin with regs do begin ax:=23; es:=PtrType(buffer).seg; dx:=PtrType(buffer).ofs; end; intr($33, regs) end; End.

44

Bibliografie: George Daniel Mateescu - Informatica pentru liceu si bacalaureat Pavel Florin Moraru- Informatica. Varianta Pascal (manual pentru clasa a 11-a) Daniela Oprescu- Informatica. Varianta Pascal. Manual pentru clasa a 11-a Anca Elena Voicu, Radu Marsanu, Ion Gh. Rosca, Marian Stoica, Constantin Apostol, Catalina Lucia Cocianu - Informatica. Manual pentru clasa a 9-a Emanuela Cerchez, Marinel Serban - Informatica. Manual pentru clasa a 10 -a

45

S-ar putea să vă placă și