Sunteți pe pagina 1din 18

Grupul Scolar Charles Laugier Craiova

Profesor indrumator: Caprioara Cristina Sustinator:

Ciausu Eduard-Florian

Craiova 2011

Tema:
Coada-Intrarea si iesirea locomotivelor dintr-un depou

Cuprins:
1.Scurta introducere in Turbo Pascal.4 2.COADA (F I F O)...6 2.1.Crearea listei de tip coada...7 2.2.Parcurgerea elementelor unei cozi8 2.3.Stergerea unui element al cozii..9 2.4.Utilitatea unei cozi10 2.5.Exemplu de program in care este utilizata coada.11 2.6.Dispecerizarea locomotivelor14 3.Bibliografie.................................................18

Scurta introducere in Turbo Pascal:

Structura programelor Pascal 1. Orice program ncepe printr-un cuvnt numit PROGRAM care este urmat de numele propriu-zis al programului, adica de un nume ales de utilizator si de semnul ; (punct si virgula) 2. Orice program contine cel putin odata cuvintele cu un nteles special BEGIN si END 3. Orice program se termina prin punct 4. Orice cuvant al programului poate fi scris cu litere mari sau mici, deoarece nu are importanta 5. n versiunea Turbo, prima linie poate lipsi, desi nu se recomanda acest lucru, din ratiuni de ordine 6. Plasarea cuvintelor pe linie si numarul de spatii dintre ele sunt la alegerea programatorului. Se poate scrie tot programul pe o singura linie, nsa este bine ca programul sa fie scris n asa fel nct sa fie usor de nteles.

Turbo Pascal - Un program scris n Pascal, orict de complex ar fi, are urmatoarea structura : PROGRAM nume: definitii de constante ; definitii de tipuri ; declaratii de variabile ;
4

declaratii de proceduri si functii ; BEGIN Instructiuni END

!Nu este obligatoriu ca ntr-un program sa figureze toate acestea, dar daca
ele figureaza, trebuie sa apara n aceasta ordine.

Orice program cuprinde doua parti esentiale : o descrierea instructiunilor ( a actiunilor) si o descrierea datelor care snt prelucrate de instructiuni

Un program Turbo Pascal este structurat astfel : a) un antet de program, care contine cuvntul rezervat PROGRAM urmat de numele programului b) o declaratie, introdusa n cuvntul rezervat USES, a numelor unit-urilor, care se vor folosi ntr-un program c) o parte obligatorie formata dintr-un bloc, urmat de caracterul punct

!Componentele a) si b) , de mai sus, pot sa lipseasca dintr-un program. Un


UNIT este o colectie de declaratii de constante, tipuri, variabile si subprograme n cod obiect (adica compilate separat), care se utilizeaza n program prin specificarea numelui sau n clauza Uses. Folosirea unit-urilor permite scrierea unor programe mari care depasesc 64 K. Dimensiunea unui program, ca si ceea a unui unit, nu poate depasi 64 K.

COADA (F I F O)
Reprezinta o categorie speciala de lista liniara, n care elementele se adauga la un capat (sfrsit) si se suprima la celalalt (nceput). Asemanarea cu o coada care se formeaza la un magazin va usura ntelegerea acestui tip de lista. Si denumirea este semnificativa : F I F O = First In First Out adica primul venit- primul servit Spre deosebire de stiva , la care operatiile se executa doar la un capat al stivei(vrf), la coada , adaugarile se fac numai la sfrsitul cozii (ca si asezarea unei persoane la rnd), iar iesirile sau stergerile , se realizeaza numai la nceputul cozii . Reprezentarea grafica a unei cozi :

Cnd coada este vida , pointerul prim va indica valoarea NIL. Deci conditia de coada vida este : prim=nil ; Variabila reper prim are ca valoare adresa primului element din lista, n timp cevariabila reper ultim,are ca valoare adresa ultimului element din lista.

Deci, spre deosebire de stiva, coada va avea doi pointeri (variabile de tip reper) : prim si ultim. Elementul curent a carui adresa este retinuta n variabila reper p,contine cele doua zone : o zona de informatie; o zona de legatura; Operatiile specifice acestei structuri sunt: crearea listei liniare de tip coada adaugarea unui element n structura stergerea unui element din structura parcurgerea (traversarea ) elementelor structurii

Crearea listei de tip coada presupune :


- adaugarea primului element ntr-o coada vida - adaugarea elementelor la sfrsitul cozii. 1.1. Adaugarea primului element presupune parcurgerea urmatoarelor etape : a)Alocarea memoriei pentru primul element: New(prim); b) Initializarea elementului alocat prin precizarea continutului zonei de informatie si al zonei de legatura : prim^.info:= .. sau Readln( prim^.info) prim^.next:=nil; c) variabila ultim va primi ca valoare adresa primului element (acesta, fiind singurul element din lista, va fi si ultimul ) : ultim:=prim; 1.2. Adaugarea unui element n coada se poate face numai la sfrsitul cozii, dupa ultimul element si presupune parcurgerea urmatoarelor etape: a) Alocarea memoriei pentru noul element : New(p) b) initializarea elementului alocat: p^.info:=. sau p^.next:=nil; Readln(p^.info) Adresa de legatura a elementului adaugat este NIL deoarece acesta este ultimul element din lista , dupa el nemaifiind nici un element. c) legarea elementului n structura: ultim^.next:=p; d) variabila ultim primeste ca valoare adresa elementului adaugat, care devine ultimul element din lista: ultim:=p;
7

Trebuie sa se tina seama de ordinea n care se executa operatiile, pentru a nu se pierde informatiile. Legarea noului element n structura presupune existenta variabilei dinamice ultim^. In cazul n care lista este vida, variabila ultim nu exista, de aceea nu este necesara legarea elementului n structura.

Crearea cozii:
Procedure creare; Begin Write( dati informatia : );readln(text); If prim=nil {coada este vida} then begin {adaugarea primului element} new(prim); prim^.info:=text; prim^.next:=nil; ultim:=prim; end else {adaugare element la sfrsitul cozii} begin new(p); p^.info:=text; p^.next:=nil; ultim^.next:=p ultim:=p end end;

Parcurgerea elementelor unei cozi:


-se realizeaza pornind de la primul element al listei (p:= prim) si trecnd pe rnd prin fiecare element (p:=p^.next) pna se ajunge la sfrsitul listei . n pseudocod parcurgerea se realizeaza astfel: p:= prim ct_timp p<>nil executa *se parcurge elementul p^ p:=p^.next sfrsit_ct_timp

Parcurgerea cozii:
Procedure listare; begin if prim=nil {coada vida} then writeln (coada este vida) else begin p:=prim; repeat writeln(p^.info); p:=p^.next until p=nil end end;

Stergerea unui element al cozii:


Presupune stergerea primului element al listei .Se parcurg urmatoarele etape: 1. Se salveaza adresa elementului ce va fi sters : p:=prim; 2. Se elimina din structura primul element prin memorarea n variabila reper prim a adresei elementului care urmeaza lui prim, acesta devenind noul prim element: prim:=prim^.next 3.Se elibereaza memoria ocupata de fostul prim element al cozii : Dispose(p). n cazul n care se sterge unicul element al listei, coada devine vida, iar variabila prim va avea valoarea nil.Procedurile corespunzatoare acestor operatii, considernd o lista de tip coada declarata astfel: Type reper=^element; element=record info:string[10]; next:reper end; Var prim, ultim,p :reper; text:string[10]; vor fi urmatoarele:

Stergerea unui element din coada:


Procedure stergere; begin if prim=nil then writeln( lista este vida ) else begin p:=prim; prim:=prim^.next; dispose(p) end end;

Utilitatea unei cozi


Utilitatea structurii de tip coada reiese din modul sau de functionare,este necesara utilizarea unei cozi atunci cand informatiile trebuie prelucrate exact in ordinea in care au fost retinute in coada. Un bun exemplu de folosire a unei cozi il reprezinta imprimanta,cand un utilizator face mai multe cereri de imprimare in acelasi timp,ele sunt memorate intr`o coada de tiparire-Queue. Imprimanta le va tipari in ordinea in care vor aparea.

10

Exemplu de program in care este utilizata coada:


Program Static_Coada; const ...max_aloc=20; var ...coada:array[1..max_aloc] of integer; ...ch:char; ...n,x,pcap,pcoada:integer; ...cod:boolean; procedure InitCoada; begin ...pcap:=1; ...pcoada:=1; ...n:=0 end; procedure AdaugaEl(x:integer;var cod:boolean); begin ...if n>=max_aloc then ......cod:=false ...else ...begin ......coada[pcoada]:=x; ......pcoada:=(pcoada+1) mod max_aloc; ......if pcoada=0 then .........pcoada:=max_aloc; ......n:=n+1; ......cod:=true ...end end; procedure ExtragEl(var x:integer;var cod:boolean); begin ...if n=0 then
11

......cod:=false ...else ...begin ......x:=coada[pcap]; ......pcap:=(pcap+1) mod max_aloc; ......if pcap=0 then .........pcap:=max_aloc; ......n:=n-1; ......cod:=true ...end end; procedure Listare; var ...i:integer; begin ...writeln('Elementele cozii sint:'); ...if pcap<pcoada then ......for i:=pcap to pcoada-1 do .........writeln(coada[i]:3) ...else ...begin ......for i:=pcap to max_aloc do .........writeln(coada[i]:3); ......for i:=1 to pcoada-1 do .........writeln(coada[i]:3) ...end end; begin {program principal} ...repeat ......writeln('I.Initializare coada'); ......writeln('A.Adauga element in coada'); ......writeln('E.Extrage element din coada'); ......writeln('L.Listare elemente coada'); ......writeln('S.Sfirsit program'); ......write('Optiunea dvs. va rog:');readln(ch); ......case upcase(ch) of ......'I':InitCoada; ......'A':begin
12

.........write('Valoarea de adaugat =');readln(x); .........AdaugaEl(x,cod); .........if cod then ............Listare .........else ............writeln('Dimensiune alocare coada insuficienta!') .........end; ......'E':begin .........ExtragEl(x,cod); .........if cod then ............writeln('S-a extras elementul',x:3) .........else ............writeln('Coada vida!') .........end; ......'L':Listare ......end; ......readln ...until ch in ['S','s'] end {Static_Coada}.

13

Dispecerizarea locomotivelor
Un exemplu clasic pentru probleme ce se rezolva utiliznd liste de tip coada este problema urmatoare: Se considera un depou de locomotive cu o singura linie de cale ferata cu o intrare si o iesire. Sa se scrie programul care realizeaza dispecerizarea locomotivelor din depou: Sa se scrie programul care realizeaza dispecerizarea locomotivelor prelucrnd comenzi de forma: I-intrarea unei locomotive, E-iesirea unei loc, Llistarea si S- oprirea programului afisnd locomotivele existente. program depozit; uses crt; type reper =^element; element=record cod:word; next:reper end; var prim, ultim, p:reper; comanda:char; procedure intrare; {adaugarea unui element}
14

var codul:word; begin write(codul locomotivei: ); readln(codul); if prim=nil then begin new(prim); prim^.cod:=codul; prim^.next:=nil; ultim:=prim; end else begin new(p); p^.cod:=codul; p^.next:=nil; ultim^.next:=p; ultim:=p end end; procedure iesire; begin if prim=nil then writeln(depoul este gol)
15

{coada este vida}

{se adauga in coada un nou element}

{stergerea primului element}

else begin writeln(iese locomotiva cu codul ,prim^.cod); p:=prim; prim:=prim^.next; dispose(p) end end; procedure listare; begin if prim=nil then writeln(depoul este gol) else begin writeln(locomotivele din depou sunt: ); p:=prim; repeat writeln(p^.cod); p:=p^.next until p=nil end end; Begin clrscr; prim:=nil; repeat
16

{traversarea cozii}

write(comanda: ); readln(comanda); comanda:=UpCase(comanda); case comanda of I:intrare; E:iesire; S,L:listare; end until comanda=S ; readln end.

17

Bibliografie:
1. Algoritmi & Limbajul Pascal - Teorie si aplicatii-Eugen Popescu, Ecaterina Ursache, Cristinele Claudia Neacsu, Editura Else 2. Informatica generala, Radu Marsanu, Editura Tehnica Bucuresti

18

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