atestat liste

25
Colegiul Tehnic “August Treboniu Laurian” PROIECT PENTRU SUSŢINEREA ATESTATULUI PROFESIONAL LA INFORMATICĂ ÎNDRUMĂTOR, CANDIDAT, Prof.Scurtu Ruxandra Mihaela Ionele Andreea Clasa a XII-a A 1

Upload: daniela-ionele

Post on 09-Nov-2015

336 views

Category:

Documents


3 download

DESCRIPTION

hgfdr

TRANSCRIPT

Colegiul Tehnic August Treboniu Laurian

PROIECT PENTRUSUSINEREA ATESTATULUI PROFESIONALLA INFORMATIC

NDRUMTOR, CANDIDAT,Prof.Scurtu Ruxandra Mihaela Ionele Andreea

Clasa a XII-a A

Mai 2015 CUPRINS

1.MOTIVUL ALEGERII TEMEI32. LISTE LINIARE SIMPLU NLNUITE4NOIUNI TEORETICE42.1.Declararea listei42.2.Operaii cu liste52.2.1. Parcurgerea i afiarea listei52.2.2. Inserarea unui nod nou52.2.3. Inserarea unui nod din list73.DESCRIEREA APLICAIEI83.1. Setarea mediului grafic n Code::Blocks83.2. Funcionarea aplicaiei83.3. Aplicaia propriu- zis.11BIBLIOGRAFIE21

1. MOTIVUL ALEGERII TEMEI

ntlnim i utilizm liste n fiecare zi: la coal, profesorul are cte o list cu elevii fiecrei clase - catalogul; la restaurant gsim o list cu produsele oferite i preurile lor - meniul; la o firm de calculatoare vom primi o list de componente i preuri - oferta .a.m.d. Prin urmare, utilizm liste ori de cte ori este necesar s organizm ntr-o form secvenial un ansamblu de informaii.Lista este o structur de date abstract constituit dintr-o succesiune de elemente. Fiecare element din list are un succesor i (eventual) un predecesor (n cazul listelor dublu nlnuite).Listele pot fi implementate cu ajutorul unor vectori (tablouri) sau dinamic, cum vom explica n aceast lucrare.De ce e de preferat utilizarea alocrii dinamice?Imaginai-v c declarm un vector de 500 de elemente de tip elev, dar folosim acea structura pentru a memora datele elevilor dintr-o clas, deci aproximativ 30 de elemente, restul elementelor sunt neutilizate. Deci facem o risip de memorie. Alta dat dorim s memorm n aceeai structur datele despre elevii unei coli. S-ar putea chiar ca cele 500 de nregistrri s nu fie suficiente.n cazul alocrii dinamice, vom folosi exact atta memorie ct este necesar la fiecare rulare a programului.

2. LISTE LINIARE SIMPLU NLNUITENOIUNI TEORETICE

Listele simplu nlnuite sunt structuri de date dinamice omogene. Spre deosebire de vectori, listele nu sunt alocate ca blocuri omogene de memorie, ci ca elemente separate de memorie. Fiecare nod al listei conine, n afar de informaia util, adresa urmtorului element. Aceasta organizare permite numai acces secvenial la elementele listei (nu putem accesa direct un nod oarecare din mijlocul listei, ci doar prin parcurgerea tuturor nodurilor pn se ajunge la nodul dorit).Pentru accesarea listei trebuie cunoscut adresa primului element (numit capul listei); elementele urmtoare sunt accesate parcurgnd lista. Lista simplu nlnuit poate fi reprezentat grafic astfel:

257518Pointer ctre primul nod al listeiInformatiiutilePoniter ctre urmtorul element din listPoniter NULL, marcarea sfritului de list

2.1.Declararea listei

Pentru memorarea listei se folosete o Structur autoreferit.Aceast structur va avea forma:

Declararea listei se face prin declararea pointerului spre primul nod al listei, i uneori este util s pstrm i un pointer spre ultimul nod al listei, dei acest pointer nu este obligatoriu:

2.2.Operaii cu liste2.2.1. Parcurgerea i afiarea listei

Lista este parcurs pornind de la pointerul spre primul element i avansnd folosind pointerii din structur pn la sfaritul listei (pointer NULL):

2.2.2. Inserarea unui nod noua) Inserarea la nceputul listei se aloc spaiul necesar

p=new nod;

2575prim41p

se leag noul nod de primul nod al listei

p->next = prim;

primp

se repoziioneaz pointerul prim

prim=p;

primp

b) Inserarea la sfritul listein acest caz trebuie nti parcurs lista i dup aceea adugat elemental i legat de restul listei. De asemenea, trebuie avut nvedere cazul n care lista este vid:

c) Inserarea dup un element datInserarea dup nodul avnd adresa memorat n pointerul p se face astfel:

2.2.3. Inserarea unui nod din lista) tergerea primului nod al listei

b) tergerea ultimului nod al listei

c) tergerea nodului p

3.DESCRIEREA APLICAIEI

3.1. Setarea mediului grafic n Code::Blocks

Pentru a scrie programe de grafic n Code::Blocks 13.12, avem nevoie de cteva fiiere suplimentare, care nu sunt instalate n mod implicit. Vom proceda n felul urmtor: Descrcm de pe internet urmtoarea arhivhttp://www.mediafire.com/download/9a2qrge2lsr6g2o/Graphics+in+CodeBlocks.rar Dezarhivm arhiva Copiem fiierele graphics.hiwinbgim.h n directorulC:\OJI\CodeBlocks\MinGW\include

Copiem fiierul libbgi.a n directorulC:\OJI\CodeBlocks\MinGW\lib Pentru fiecare proiect nou care va folosi grafica vom allege din meniu: Settings ->Compiler -> Linker settingsi n caseta Other linker options introducem:-lbgi-lgdi32-lcomdlg32-luuid-loleaut32-lole32

3.2. Funcionarea aplicaieiAm optat pentru implementarea unui program care s prezinte ntr-un mod vizual toate operaiile pe liste simplu nlnuite alocate dinamic.La rularea programului va aprea un meniu simplu din care vom alege pe rand opiunile dorite:

Programul are cteva funcii auxiliare care ne ajut la desenarea listei:

void desen_nod(int x,int y,int v,int i,int da)

deseneaz cel de al i-lea nod din list, primul nod fiind considerat nodul 0 parametrii funciei au urmtoarea semnificaie: x, ycoordonatele stnga, sus ale primului nod din list, n funcie de aceste coordonate se calculeaz coordonatele celorlalte noduri din list v valoarea memorat n nod inumrul de ordine al nodului da este un parametru care ne indic ce fel de sgeat trebuie sa desenm dacda=1este un nod normal cu sgeat la dreapta dacda=2 nu desenm deloc legtur dacda=0legtura se va desena la pmnt (ultimul nod)

int desen (int x,int y,nod *p) deseneaz ntreaga list apelnd n pentru fiecare nod funcia precedent p reprezint adresa primului nod al listei

void itoa(int x,char s[]) transform numrul ntreg x, ntr-un ir de caractere. Se obine de exemplu din numrul 123 irul 123. Pentru aceasta mai nti se scot pe rnd cifrele numrului i se adaug la finalul irului

x=123x%10 = 3s=3x=12x%10 = 2s=32x=1x%10 = 1s=321

apoi inversm irul obinut, interschimbnd caracterul s[j] cu s[i-1-j]unde i reprezint numrul de cifre.

Celelalte funcii realizeaz operaiile obinuite pe liste.

Adugarea unui nod la sfrit

tergerea unui nod

Adugarea n faa unui nod

3.3. Aplicaia propriu- zis.

#include #include

usingnamespacestd;

struct nod{intval;nod*next;};

int n;

voiditoa(intx,char s[])// la versiuneamainoua de CodeBlocks nu are // implementatafunctiaitoa{inti=0,j;while(x>0)// pun cifrelepe rand in sirul s{s[i]=x%10+'0';// transform cifra in caracteri++; x=x/10;}s[i]='\0';// sf sirului// intorcsirulpt a fi cifrele in ordinea din numarfor(j=0;jnext!=NULL){desen_nod(x,y,q->val,i,1);i++;q=q->next;}desen_nod(x,y,q->val,i,0);returni;}elsereturn0;delay(500);}

voidadaug_sf(nod *&p,int nr){nod*q,*c;int n;

initwindow(1200,700);setcolor(WHITE);

if(p!=NULL)n=desen(100,100,p);elsen=0;

c=new nod;c->val=nr;c->next=NULL;n++;

setcolor(RED);desen_nod(120,100,c->val,n,0);

if(p==NULL){p=c;delay(1000);}else{q=p;while(q->next!=NULL)q=q->next;

setcolor(YELLOW);desen_nod(100,100,q->val,n-1,0);delay(500);

setcolor(BLACK);int x=100, y=100,i=n-1;line(x+(i+1)*150,y+25,x+(i+1)*150,y+75);line(x+(i+1)*150-10,y+75,x+(i+1)*150+10,y+75);delay(300);

setcolor(YELLOW);line(x+(i+1)*150+20,y+25,x+(i+1)*150,y+25);line(x+(i+1)*150+20,y+25,x+(i+1)*150+10,y+15);line(x+(i+1)*150+20,y+25,x+(i+1)*150+10,y+35);

delay(1000);

q->next=c;}closegraph();}

voidadaug_i(nod *&p,int nr){nod*c=new nod;initwindow(1200,700);setcolor(WHITE);

desen(250,100,p);

c->val=nr;c->next=p;p=c;

setcolor(RED);desen_nod(100,100,nr,0,2);delay(300);

// legline(180,125,250,125);delay(500);

// sagetiif(p->next==NULL){line(250,125,250,175);line(240,175,260,175);}else{line(250,125,240,115);line(250,125,240,135);}delay(1000);

closegraph();}

voidadaug_dupa(nod *p,nod*q,intnr,inti)// nr val de inserat// i nr de ordine al nodului q{if(q->next==NULL)adaug_sf(p,nr);else{initwindow(1200,700);setcolor(WHITE);

desen(100,100,p);

nod*c=new nod;c->val=nr;

setcolor(RED);desen_nod(180,250,nr,i,2);

// desenezlegatura de la noul nod la nodul de dupa qc->next=q->next;line(180+i*150+80,275,300+i*150,275);line(300+i*150,275,300+i*150,150);

// desenezsageata la noualegaturaline(300+i*150,150,300+i*150-10,160);line(300+i*150,150,300+i*150+10,160);delay(1000);

// NOUA LEGATURA DE LA q LA NOUL NOD INSERATq->next=c;

// coloreznoduldupa care inserezsetcolor(YELLOW);desen_nod(100,100,q->val,i,1);delay(1000);

// sterglegaturasetcolor(BLACK);line(180+i*150,125,250+i*150,125);line(100+(i+1)*150,125,90+(i+1)*150,115);line(100+(i+1)*150,125,90+(i+1)*150,135);delay(500);

// deseneznoualegaturasetcolor(YELLOW);line(180+i*150,125,180+i*150,250);

// desenezsageatanoiilegaturiline(180+i*150,250,180+i*150-10,240);line(180+i*150,250,180+i*150+10,240);

delay(2000);closegraph();}}

voidadaug_in_fata(nod *&p,nod*q,intnr,inti){if(q==p)adaug_i(p,nr);else{initwindow(1200,700);setcolor(WHITE);

desen(100,100,p);

nod*c=new nod;c->val=nr;

// deseneznoul nodsetcolor(RED);desen_nod(180,250,nr,i-1,2);

// coloreznodul in fata caruiainserez care inserezsetcolor(YELLOW);if(q->next==NULL)desen_nod(100,100,q->val,i,0);elsedesen_nod(100,100,q->val,i,1);delay(1000);

// NOUA LEGATURA DE LA NOUL NOD LA qc->next=q;

// desenezlegatura de la noul nod la nodul qsetcolor(RED);line(30+i*150+80,275,150+i*150,275);line(150+i*150,275,150+i*150,150);

// desenezsageata la noualegaturaline(150+i*150,150,140+i*150,160);line(150+i*150,150,160+i*150,160);delay(1000);

// determinnodul din fata lui qnod*t=p;while(t->next!=q)t=t->next;// refaclegatura de la t la noul nodt->next=c;

// colorez in albastrunodul din fata lui qi--;setcolor(BLUE);desen_nod(100,100,t->val,i,1);delay(500);

// sterglegaturasetcolor(BLACK);line(180+i*150,125,250+i*150,125);line(100+(i+1)*150,125,90+(i+1)*150,115);line(100+(i+1)*150,125,90+(i+1)*150,135);delay(500);

// deseneznoualegaturasetcolor(BLUE);line(180+i*150,125,180+i*150,250);

// desenezsageatanoiilegaturiline(180+i*150,250,180+i*150-10,240);line(180+i*150,250,180+i*150+10,240);

delay(2000);closegraph();}}

voidcaut(nod *p,intnr,int&i,nod*&q)// cautavaloarea nr in listasireturneaza in q adresanodului, iar in i// pozitianodului{q=p;i=0;while(q!=NULL&& q->val!=nr){i++;q=q->next;}}

voidsterg_prim(nod *p){initwindow(1200,700);setcolor(WHITE);desen(100,100,p);

// indicamprimul nodsetcolor(RED);desen_nod(100,100,p->val,0,1);outtextxy(100,80,"p");delay(1000);

outtextxy(100,60,"q");delay(1000);

// stergemetichetaprimului nod ca sailmutam la al doileasetcolor(BLACK);outtextxy(100,80,"p");

// punem p la al doilea nodsetcolor(RED);outtextxy(250,80,"p");delay(1000);

// stergeprimul nodsetcolor(BLACK);desen_nod(100,100,p->val,0,1);outtextxy(100,60,"q");nod*q=p; p=p->next;delete(q);

delay(2000);closegraph();}

voidsterg_ultim(nod *p){nod*q;inti=0;// cautampenultimul nod q=p;while(q->next->next!=NULL){i++; q=q->next;}

initwindow(1200,700);setcolor(WHITE);desen(100,100,p);

// desenam cu rosuultimul nodsetcolor(RED);desen_nod(100,100,q->next->val,i+1,0);delay(1000);

// desenampenultimul nod cu galbensetcolor(YELLOW);desen_nod(100,100,q->val,i,1);outtextxy(250,80,"q");delay(1000);

// stergemultimul nodsetcolor(BLACK);desen_nod(100,100,q->next->val,i+1,0);delay(500);delete q->next;

// sterglegaturasetcolor(BLACK);line(100+(i+1)*150,125,90+(i+1)*150,115);line(100+(i+1)*150,125,90+(i+1)*150,135);delay(1000);

// redesenezlegatura la pamantsetcolor(YELLOW);line(100+(i+1)*150,125,100+(i+1)*150,175);line(100+(i+1)*150-10,175,100+(i+1)*150+10,175);

delay(2000);closegraph();}

voidsterg_q(nod *p,nod*q){nod*q1;inti=0;// cautamnodul din fata lui q q1=p;while(q1->next!=q){i++; q1=q1->next;}

initwindow(1200,700);setcolor(WHITE);desen(100,100,p);

// desenamnodul q cu rosusetcolor(RED);desen_nod(100,100,q->val,i+1,1);outtextxy(250,80,"q");delay(1000);

// desenamnodul q1 cu galbensetcolor(YELLOW);desen_nod(100,100,q1->val,i,1);delay(1000);

// sterglegaturasetcolor(BLACK);line(100+(i+1)*150,125,90+(i+1)*150,115);line(100+(i+1)*150,125,90+(i+1)*150,135);line(180+i*150,125,250+i*150,125);delay(1000);

// deseneznoualegatura q1->next=q->next;

setcolor(YELLOW);line(180+i*150,125,180+i*150,50);line(180+i*150,50,100+(i+2)*150,50);line(100+(i+2)*150,50,100+(i+2)*150,100);line(100+(i+2)*150,100,90+(i+2)*150,90);line(100+(i+2)*150,100,110+(i+2)*150,90);delay(1000);

// stergemnodul qsetcolor(BLACK);desen_nod(100,100,q->val,i+1,1);outtextxy(250,80,"q");delete(q);

delay(2000);

closegraph();

}

int main (){int x=100,y=100;intnr,a;int o;

char s[20];

itoa(1234,s);

nod*p=NULL,*q;while(1){system("cls");cout