P. 1
Tehnici de Program Are An1 - Sem2

Tehnici de Program Are An1 - Sem2

|Views: 6,863|Likes:
Published by duv84alina

More info:

Categories:Types, School Work
Published by: duv84alina on Jun 10, 2010
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as PDF, TXT or read online from Scribd
See more
See less

06/22/2015

pdf

text

original

O coadă (eng. queue) este o listă liniară în care inserările se fac doar
în capul listei, iar extragerile doar din coada listei. Cozile se numesc şi
liste FIFO (eng. First In First Out). O reprezentare secvenţială pentru
o coadă se obţine prin utilizarea unui tablou C[0 .. n-1], pe care îl
tratăm ca şi cum ar fi circular: după locaţia C[n-1] urmează locaţia
C[0]. Fie p variabila care conţine indicele locaţiei predecesoare primei
locaţii ocupate şi fie u variabila care conţine indicele locaţiei ocupate
ultima oară. Variabilele p şi u au aceeaşi valoare atunci şi numai

56

atunci când coada este vidă. Iniţial, avem p= u= 0. Inserarea şi
ştergerea (extragerea) unui nod necesită timp constant.

Operaţii asupra cozii:
function insert-queue(x, C[0 .. n-1])
{adauga nodul x in capul cozii}
p ← (p+1) mod n
if p=u then return “coada plina”
C[p] ← x
returnsucces
function delete-queue(C[0 .. n-1])
{sterge nodul din coada listei si il returneaza}
if p=u then return “coada vida”
u ← (u+1) mod n
x
C[u]

return x

Testul de coadă vidă este acelaşi cu testul de coadă plină. Dacă s-ar
folosi toate cele n locaţii, atunci nu am putea distinge situaţia de
coadă plina” şi cea de “coadă vidă”, deoarece în ambele situaţii am
avea p = u. Se folosesc efectiv numai n-1 locaţii din cele n ale
tabloului C, deci se pot implementa astfel cozi cu cel mult n-1 noduri.

Problemă rezolvată: Relizarea unui meniu pentru implementarea
statică a cozii.

Rezolvare: Cea mai simplă implementare a cozii static este folosirea
unui tablou. Pentru gestionarea cozii este nevoie de două elemente: p
poziţia primului element şi u poziţia de după ultimul element din
coadă. Se va face o utilizare circulară a spaţiului alocat astfel:
următoarea poziţie este p mod n +1.

Implementarea Pascal:
TYPE
coada=array[1..50] of integer;
var c:coada; p,n,u,o,x:integer;
procedure adaugare(var c:coada; var p,u:integer;x:integer);
begin

if p<>(u mod n)+1 then
begin
c[u]:=x; u:=u mod n +1 end
else
writeln('coada plina');

end;

57

procedure stergere(var c:coada; var p,u,x:integer);
begin
if
p<>u then begin x:=c[p]; p:=p mod n+1 end
else
writeln('coada goala');

end;
procedure listare(c:coada;p,u:integer);
var i:integer;
begin

if p=u then writeln('coada goala')
else begin

i:=p;
while i<>u do begin write(c[i],' '); i:=i mod n+1 end;
end;

end;
begin

writeln('nr max de elem');
read(n);n:=n+1;
p:=1;u:=1;
repeat

writeln('1..adaugare');
writeln('2..stergere');
writeln('3..listare');
write('citeste optiunea');readln(o);
case o of

1: begin

write('introduceti numarul adaugat');readln(x);
adaugare(c,p,u,x);
end;
2: begin

stergere(c,p,u,x);
if p<>u then writeln(x);
end;
3: listare(c,p,u);

end;
writeln;

until o=4;

end.

Exerciţiu: Să se implementeze aplicaţia de mai sus în limbajul C++.

58

Problemă rezolvată: Să se creeze un program care să conţină un
meniu cu operaţii asupra unei cozi alocate dinamic.

Rezolvare:
Implementarea în limbajul C++:

#include
#include
#include // intrări-ieşiri în C++
typedef struct nod {int inf; struct nod *urm; }lista;
void adaug(lista* &prim, int x){
lista *nou, *p;
nou=new lista; // crearea unui nod în C++
nou->inf=x;nou->urm=NULL;
if (prim==NULL) prim=nou;
else {

nou->urm=prim; prim=nou;
}

}
lista * creare(){
int n,x;
lista*prim;
prim=NULL;
clrscr();
cout<<"\n nr. de noduri=";cin>>n;
for (int i=0;i cout<<"inf "<<(i+1)<<":";
cin>>x;
adaug(prim,x);
}
return prim;
}
void parcurgere(lista *prim){
lista *p;
clrscr();
p=prim;
while (p!=NULL){
cout<inf<<' '; p=p->urm;}

cout<<'\n';
getch();

}

59

void sterg(lista *&prim){
lista *p;
if (prim==NULL) cout<<"coada este vida";
else {

p=prim;
while (p->urm->urm!=NULL){p=p->urm;}
delete p->urm; p->urm=NULL;
}

}
void main(){

lista *prim=NULL;
int opt,x;
do{

clrscr();
cout<<"Coada\n";
cout<<"1.Creare coada\n";
cout<<"2.Adaugare\n";
cout<<"3.Stergere\n";
cout<<"4.Parcurgere\n";
cout <<"5.Iesire\n";
do{

cout<<"optiunea";cin >>opt;
}while (opt<1&&opt>5);
switch(opt){

case 1:{prim=creare();break;}
case 2:{

clrscr();cout<<"inf. noua:";cin>>x;
adaug(prim,x);break;
}
case 3:{

clrscr();
cout<<"inf stearsa="<<(prim->inf);
sterg(prim);break;
}
case 4:{

parcurgere(prim); getch();break;
}

}

}while (opt!=5);
}

60

Exerciţiu: Să se realizeze programul în Pascal corespunzător
aplica
ţiei de mai sus.

Probleme propuse:

1. Fiind dată o listă simplu înlănţuită având informaţii numere întregi
să se elimine numerele negative.
2. Să se realizeze interclasarea a n liste simplu înlănţuite ordonate
crescător.
3. Fiind date două liste simple cu informaţii de tip întreg, să se
realizeze subprograme pentru următoarele operaţii: intersecţia,
reuniunea, diferenţa şi diferenţa simetrică a elementelor celor
două liste.
4. Să se scrie un program care citeşte cuvintele dintr-un fişier text
in.txt, cuvintele sunt separate prin spaţii şi afişează numărul de
apariţii al fiecărui cuvânt din fişier. Se vor folosi liste simplu
înlănţuite.
5. Să se elimine dintr-o listă simplu înlănţuită toate nodurile care au
o informaţie dată.
6. Să se realizeze operaţii cu matrici rare folosind alocarea dinamica.
7. Fiind dată o listă dublă, să se separe în două liste elementele de pe
poziţii pare de elementele de pe poziţii impare.
8. Fiind dată o listă dublă cu informaţii de tip şir de caractere, să se
facă ordonarea elementelor listei.
9. Fiind dată o listă dublă cu informaţii de tip întreg să se
construiască o listă dublă numai cu elemente prime.
10. Pe o tijă sunt n bile colorate cu cel mult k culori, fiecare bilă
având o etichetă cu un număr de la 1 la n. Să se mute bilele pe alte
k tije, pe fiecare punând numai bile din aceeaşi culoare. Să se
afişeze bilele de pe fiecare din cele k tije, folosind structuri
dinamice.
Indicaţie: Tija iniţială reprezintă o stivă, informaţia dintr-un nod va fi
compusă din numărul bilei şi numărul culorii. Se va parcurge stiva şi
se adaugă în stiva corespunzătoare culorii, apoi se şterge din stiva
iniţială. Se va lucra cu un vector de stive pentru cele k tije.

11. Să se implementeze subprograme pentru operaţiile de bază cu liste
circulare duble.
12. Fie un traseu circular ce cuprinde n oraşe. O maşină trebuie să
parcurgă toate oraşele şi să se întoarcă de unde a plecat.
Parcurgerea se poate face în ambele sensuri. Se cere să se

61

determine un traseu posibil de parcurgere astfel încât să nu rămână
în pană ştiind că în fiecare oraş există o staţie de benzină cu o
cantitate de benzină suficientă, iar maşina consuma c litri la 100
de kilometri.
13. Fiind dată o listă circulară dublă, să se facă un subprogram de
inserare a unui element pe o poziţie dată.
14. Să se realizeze un subprogram care şterge elementele egale cu
zero dintr-o listă circulară.
15. Să se creeze o listă de liste, să se parcurgă şi să se şteargă.
16. Să se scrie un program care citeşte cuvintele dintr-un text şi
afişează numărul de apariţii al fiecărui cuvânt din textul respectiv.
17. Să se scrie un program care citeşte cuvintele dintr-un text şi scrie
numărul de apariţie al fiecărui cuvânt, în ordinea alfabetică a
cuvintelor respective.
18. Într-o gară se consideră un tren de marfă ale cărui vagoane sunt
inventariate într-o listă. Lista conţine, pentru fiecare vagon,
următoarele date: codul vagonului, codul conţinutului vagonului,
adresa expeditorului, adresa destinatarului. Deoarece în gară se
inversează poziţia vagoanelor, se cere listarea datelor despre
vagoanele respective în noua lor ordine.
Indicaţie: se creează o stivă în care se păstrează datele fiecărui vagon.
Datele corespunzătoare unui vagon constituie un element al stivei,
adică un nod al listei simplu înlănţuite. După ce datele au fost puse în
stivă, ele se scot de acolo şi se listează.

19. La o agenţie CEC există un singur ghişeu care se deschide la ora 8
şi se închide la ora 16, dar publicul aflat la coadă este deservit în
continuare. Deoarece la ora închiderii coada este destul de mare se
ridică problema oportunităţii deschiderii a încă unui ghişeu la
agenţia respectivă. Se cunosc operaţiile efectuate la agenţie şi
timpul lor de execuţie. În acest scop se realizează o simulare pe
calculator a situaţiei existente care să stabilească o medie a orelor
suplimentare efectuate zilnic pe o perioadă de un an.
Indicaţie: Programul de simulare a problemei indicate construieşte o
coadă de aşteptare cu persoanele care sosesc la agenţie în intervalul de
timp indicat. Se va folosi funcţia random pentru a determina operaţia
solicitată şi apoi pentru a determina intervalul de timp între două
persoane care vin la agenţie.

62

20. Să se realizeze un program care implementează subprograme
pentru crearea şi exploatarea unei cozi duble.
21. Se dă o matrice rară memorată într-o listă. Se cere:
a) să se afişeze toate elementele diferite de zero de pe diagonala
principală, secundară;
b) să se afişeze pe ecran matricea sub forma obişnuită, fără
reconstituirea ei în memorie.

You're Reading a Free Preview

Download
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->