Você está na página 1de 46

Cuprins:

Pagina
Scurt istoric al evolu\iei calculatoarelor

Limbajul Pascal ....

Alocarea dinamic` a memoriei @n Pascal ..

Liste simplu @nl[n\uite

Liste dublu @nl[n\uite ..

Liste circulare ..

13

Implementarea Pascal a aplica\iei .

14

Bibliografie .

45

Scurt istoric al evolu\iei calculatoarelor


Prima ma]in[ de adunat numere poate fi considerat[ cea creat[ n
1642 de c[tre Blaise Pascal, mbun[t[\it[ cteva decenii mai trziu de c[tre
Leibnitz astfel nct s[ fie capabil[ s[ efectueze cele patru opera\ii aritmetice.
Mecanismul ei, cu ro\i din\ate, se p[streaz[ si ast[zi, n casele mecanice de
marcaj si n vitezometrele automobilelor.
Dup[ recens[mntul din SUA din 1890 Hollerith a pus bazele unei mici
@ntreprinderi de prelucrare a datelor statice, care a fuzionat n timp cu altele
iar ast[zi se nume]te IBM.
Istoria efectiv[ a calculatoarelor ncepe la mijlocul secolului trecut
cnd Charles Babbage a proiectat si a ncercat n zadar s[ construiasc[ o
ma]in[ analitic[" ce poate fi considerat[ prototipul calculatorului de ast[zi. Ca
ajutor avea pe Ada-Augusta de Lovelace; aceasta a imaginat primele
programe.Babbage a murit n anul 1871, iar planurile sale au fost abandonate si
uitate. n aceea]i perioad[ matematicianul George Boole a avut alte idei
excentrice: s[ fac[ adun[ri si nmul\iri cu propozi\ii, nu cu numere, si s[ fac[ o
algebr[ a ra\ionamentelor logice.
Secolul nostru a nceput printr-o dezvoltare exploziv[ a tehnicii
bazate pe fenomenele electromagnetice. Aceasta a permis reluarea ideii de a
crea o ma]in[ de calcul. Un prim proiect a fost nceput n anul 1937 de c[tre
Aiken, la Universitatea Harvard, si s-a finalizat n anul 1944 prin realizarea
ma]inii Mark I, ce func\iona pe baza releelor electromagnetice.
#ntre timp s-a construit si prima ma]in[ ce poate fi numit[
electronic[, ntruct folosea tuburi electronice; ea era specializat[ pe rezolv[ri de
ecua\ii. Creatorii au trecut apoi la construirea unei ma]ini generale numit[
ENIAC si terminat[ n primii ani ai r[zboiului , n secret, n aceea]i perioad[
matematicianul John von Neumann a avut ideea de a introduce si programul de
lucru, nu numai datele ini\iale, n interiorul calculatorului, ideea fundamental[
pentru evolu\ia tuturor ma]inilor de calcul ulterioare, n 1949 a fost creat
2

primul calculator ce putea fi programat. O parte din echipa care 1-a creat s-a
desprins si a nceput s[ construiasc[ a]a numitul UNIVAC (Universal
Automatic Computer), n anul 1951, cnd acesta a nlocuit aparatura lui
Hollerith n prelucr[rile oficiale de date statistice americane, conducerea
firmei IBM s-a decis s[ intre rapid n competi\ia calculatoarelor electronice.
Primul calculator al acestei firme a intrat n exploatare n anul 1954 si n anul
1955 firma IBM a preluat conducerea n produc\ia de calculatoare, nainte de a
fi lansat[ cea de-a treia genera\ie de calculatoare au mai existat nc[ dou[
genera\ii, astfel:
Genera\ia I (1945-1955). Calculatoarele din aceast[ genera\ie nu
aveau sisteme de operare (S.O.=un ansamblu de programe ce coordoneaz[
hardul) si erau construite din tuburi electronice (l[mpi). Programele erau
introduse bit cu bit.
Genera\ia a Il-a (1955-1964). Calculatoarele din aceast[ genera\ie
aveau o tehnologie bazat[ pe componente semiconductoare( diode, tranzistori).
Firma IBM a lansat ncepnd cu anul 1964 calculatoarele de
genera\ia a IlI-a (1964-1975), care erau influen\ate de apari\ia circuitelor
integrate, n aceast[ genera\ie calculatoarele aveau memorii cu o capacitate mai
mare .Dup[ c\iva ani au fost aruncate pe pia\[ calculatoarele din seria 370
avnd n componen\[ cipuri de siliciu . Despre aceste calculatoare se afirm[ c[ ar
constitui a IV-a genera\ie de calculatoare.
Genera\ia a V-a , specific[ zilelor noastre , este dotat[ n plus cu
circuite integrate tridimensionale, si folose]te alte tehnologii speciale cu
circuite integrate de tip VLSI (Very Large Scale Integration).
Evolu\ia calit[\ii calculatoarelor este exploziv[:
reducerea
dimensiunilor este spectaculoas[; timpul de execu\ie al unei instruc\iuni a
sc[zut; capacitatea de memorare a crescut si ea , iar programele au atins nivele
de neimaginat acum 40 de ani. Putem spune c[ am intrat n epoca revolu\iei
informatice.

LIMBAJUL PASCAL
Acest program este conceput si construit n anul 1970 de profesorul
Niklaus Wirth de la Politehnica din Zurich. Limbajul a fost numit Pascal n
memoria matematicianului , filozofului Blaise Pascal , creatorul primei ma]ini
mecanice de adunat.
Dup[ cum afirma profesorul Wirth , limbajul Pascal a fost conceput din
considerente

didactice,

vederea

pred[rii

artei

program[rii

calculatoarelor. S-a urm[rit, totodat[ , ca limbajul s[ reflecte clar ]i natural


concepte fundamentale ale program[rii si s[ permit[ implement[ri fiabile si
eficiente pe calculatoarele existente. Datorit[ calit[\ilor sale, limbajul Pascal, a
cucerit rapid nu numai lumea universitar[ ci ]i pe aceea a programatorilor
profesioni]ti.
O contribu\ie important[ la succesul de care se bucur[ limbajul a avuto versiunea TURBO PASCAL , elaborat[ de firma american[ BORLAND
INTERNATIONAL inc., si implementarea pe calculatoarele IBM-PC.
Limbajul Pascal este un limbaj de programare care respect[
principiile program[rii structurate si are drept caracteristica esen\ial[
modularitatea , adic[ organizarea unui program ntr-o form[ ierarhic[ de sus n jos
n subprograme semi-independente.
Orice program Pascal cuprinde dou[ p[r\i:
-

O sec\iune de declara\ii.

O sec\iune de instruc\iuni.

Alocarea dinamic` a memoriei \n


TURBO PASCAL
Din punctul de vedere al unui programator, memoria
calculatorului se prezint` ca o succesiune de octe]i, fiecare
octet av#nd o adres` binar` bine stabilit`. Ace[ti octe]i sunt
identifica]i prin numere cuprinse \ntre 0 [i n-1. Convenim s`
numim adres` num`rul de ordine al unui octet. Un octet este
format din 8 bi]i. Fiecare bit poate memora fie cifra binar` 1, fie
cifra binar` 0. Diversele tipuri de date cunoscute p#n` acum
(INTEGER, REAL) ocup` 2 sau mai mul]i octe]i consecutivi.
Pentru fiecare tip de dat` cunoscut exist` o anumit` logic`
potrivit c`reia se face memorarea efectiv` a con]inutului. De
exemplu, pentru tipul INTEGER memorarea se face \n COD
COMPLEMENTAR. Nu ne propunem s` prezent`m modul de
reprezentare a datelor. Ne m`rginim numai s` atragem aten]ia
c` o variabil` folosit` de noi \n program are un nume (simbolic),
o valoare [i o adres` la care o g`sim memorat`(adresa primului
octet din cei p octe]i consecutivi ocupa]i de variabil`). |n
general, \n limbajele evoluate nu este necesar ca programatorul
s` cunoasc` adresa la care se g`sesc variabilele cu care
lucreaz`.
Se cunosc dou` forme de alocare a memoriei de c`tre
programator \n cadrul limbajului PASCAL :static` [i dinamic`.
1) Utiliz#nd forma de alocare static`, varibilele se declar`
utiliz#nd cuv#ntul cheie VAR la \nceputul programului.
2) Utiliz#nd forma de alocare dinamic`, \n timpul rul`rii
programului,

\n

func]ie

de

necesit`]i,

suplimentar` sau se renun]` la ea.


5

se

aloc`

memorie

Pentru alocarea dinamic` utiliz`m tipul de date referin]`. Se


consider` secven]a de program :
type ref=^inr;
inr=record
nr:integer;
adrum:ref
end;
var c:ref;
Aici variabila c este o variabil` de tip referin]`. Ea re]ine
adrese de \nregistr`ri. La r#ndul ei , o \nregistrare are dou`
c#mpuri: nr, care re]ine un num`r \ntreg (informa]ia util`) [i
adrum(adresa

urm`toare),

care

re]ine

adresa

unei

alte

\nregistr`ri.
Procedura NEW(c) rezev` spa]iu (un num`r de octe]i
consecutivi) pentru o \nregistrare, adresa primului octet fiind
depus` \n variabila c.
Presupunem c` variabila c con]ine adresa unei \nregistr`ri .
Procedura DISPOSE(c) elibereaz` spa]iul de memorie afectat
acelei \nregistr`ri care are adresa \n c. Cuv#ntul NIL are
semnifica]ia nici o adres`.
Ovseva]ii:
1) c se refer` la adresa care se gase[te \n variabila c;
2) c^.nr se refer` la c#mpul numeric al \nregistr`rii care are
adresa memorat` \n variabila c;
3) c^.adrum semnific` adresa de \nregistrare care se
g`se[te
memorat` \n cadrul \nregistr`rii care are adresa c;
4) c^.adrum^.nr semnific` variabila nr care se g`se[te \n
6

\nregistrarea care are adresa plasat`

\n c#mpul adrum al

\nregistr`rii cu adresa c.
Observa]ie foarte important`: spa]iul necesar variabilelor
alocate dinamic se rezerv` \ntr-o zon` de memorie, special
destinat`, numit` HEAP .
Structuri dinamice
Lista simplu \nl`n]uit`
O list` liniar` simplu \nl`n]uit` este o structur` de forma:
In1

adr2

In2 adr3

Inn

Nil

Semnifica]ia nota]iilor folosite este urm`toarea:


adr1, adr2,,adrn reprezint` adresele din memorie ale celor
n \nregistr`ri;
in1,in2,,inn reprezint` informa]iile utile din cele n
\nregistr`ri (altele dec#t cele de adres` pentru \nregistrarea
urm`toare).
Denumirea simplu \nl`n]uit` provine din faptul c` fiecare
element al listei con]ine o singur` adres`, [i anume adresa
elementului urm`tor din list`. Aici avem o excep]ie pentru
ultimul element, care are \n c#mpul de adres` cuv#tul cheie
NIL (semnific#nd nici o adres`). Opera]iile pe care le putem
face \n leg`tur` cu aceast` structur` de date sunt urm`toarele :
1) creare;
2) listare;
3) ad`ugare;
4) [tergere.
7

|n programul care urmeaz` aceste opera]ii sunt realizate de


procedurile cu acela[i nume (facem precizarea c`, \n program,
informa]iile utile sunt date de numere 1,2,,n). Am recurs la
aceast` cale din dorin]a de a simplifica pe c#t posibil
prezentarea.

1) Creare
Se cere

num`rul n de \nregistr`ri. Se creeaz` o prim`

\nregistrare av#nd ca informa]ie util` num`rul 1. Variabila b de


tip referin]` re]ine adresa primei \nregistr`ri din list`. Pentru
fiecare i cuprins \ntre 2 [i n se adaug` c#te o nou` \nregistrare
listei. Variabila d re]ine adresa ultimei \nregistr`ri deja create
pentru a-i completa c#mpul de adres`. Se procedeaz` astfel
pentru c` \n momentul \n care am creat o \nregistrare nu se
cunoa[te adresa \nregistr`rii care urmeaz`.
2) Listare
Am precizat faptul c` b re]ine adresa primei \nregistr`ri.
Pentru a nu deteriora aceast` valoare, o vom memora \n
variabila c. At#t timp c#t nu am ajuns la sf#r[itul listei, tip`rim
informa]ia util` [i \ncerc`m \n c adresa \nregistr`rii urm`toare.
3) Ad`ugare
Opera]ia de ad`ugare a unui nou element la list` comport`
cunoa[terea a dou` informa]ii:
informa]ia util` a elementului (\nregistr`rii) din list`
dup` care urmeaz` s` se fac` ad`ugarea;

informa]ia util` a elementului care urmeaz` s` fie


ad`ugat.
Ad`ugarea propriu-zis` const` \n urm`toarele:
pozi]ionarea pe \nregistrara dup` care urmeaz` s`
ad`ug`m noua \nregistrare;
alocarea spa]iului pentru noua \nregistrare;
completarea informa]iei utile pentru aceasta;
completarea adresei urm`toare a noii \nregistr`ri, care
va fi adresa urm`toare a \nregistr`rii pe care suntem
pozi]iona]i;
c#mpul de adres` al \nregistr`rii pe care suntem
pozi]iona]i va lua ca valoare adresa noii \nregistr`ri.
Observa]ie:
A[a cum este conceput` procedura, nu se poate ad`uga o
prim` \nregistrare listei. Propunem ca exerci]iu modificarea ei \n
acest sens.
4) {tergerea
Pentru a [terge o \nregistrare este necesar s` cunoa[tem
informa]ia util` a acesteia. Vom proceda \n mod diferit pentru
situa]iile \n care se [terge prima \nregistrare sau una diferit` de
prima.
|n cazul \n care [tergem prima \nregiatrare, efectu`m
opera]iile:
se salveaz` \n variabila c adresa primei \nregistr`ri (cea
care urmeaz` a fi [tears`);

variabila b (care re]ine adresa primei \nregistr`ri) va lua


ca valoare adresa urm`toare primei \nregistr`ri;
se elibereaz` spa]iul rezervat \nregistr`rii [terse.
|n situa]ia \n care [tergem o alt` \nregistrare dec#t prima,
proced`m \n felul urm`tor:
se face pozi]ionarea pe \nregistrarea care urmeaz` a fi
[tears`;
c#mpul de adres` al \nregistr`rii precedente cap`t`
valoarea c#mpului de adres` al \nregistr`rii curente;
eliber`m spa]iul rezervat \nregistr`rii curente.

Lista liniar` dublu \nl`n]uit`


O list` dublu \nl`n]uit` este o structur` de date de forma:
NIL

in1

adr2

adr1 in2

adr3

adrn-1 inn

NIL

Opera]iile pe care le facem cu o list` dublu \nl`n]uit` sunt


urm`toarele:
1. creare;
2. ad`ugare la dreapta;
3. ad`ugare la st#nga;
4. ad`ugare \n interiorul listei;
5. [tergere din interiorul listei;
6. [tergere la st#nga listei;
7. [tergere la dreapta lisrei;
10

8. listare de la st#nga la dreapta;


9. listare de la dreapta la st#nga.
1) Creare
O list` dublu \nl`n]uit` se creeaz` cu o singur` \nregistrare.
Pentru a ajunge la num`rul de \nregistr`ri dorit, utiliz`m
proceduri de ad`ugare la st#nga sau la dreapta. |n programul
de fa]` acest lucru este realizat de procedura creare. Aceast`
procedur` realizeaz` opera]iile urm`toare:
--- citirea informa]iei utile;
--- alocarea de spa]iu pentru \nregistrare;
--- completarea \nregistr`rii cu informa]ia util`;
--- completarea adreselor de leg`tur` la st#nga [I la
dreapta

cu NIL;

--- variabilele

tip referin]` b [i s vor c`p`ta valoarea

adresei
acestei prime \nregistr`ri (b semnific` adresa
\nregistr`rii cea mai din st#nga, s adresa ultimei \nregistr`ri din
dreapta).
2) Ad`ugare la dreapta
Aceast` opera]ie este realizat` de procedura addr. Pentru
ad`ugarea unei \nregistr`ri se realizeaz` urm`toarele opera]ii;
--- citirea informa]iei utile;
--- alocarea spa]iului pentru \nregistrare;
--- completarea adresei la dreapta cu NIL;
--- completarea adresei din st#nga cu adresa celei mai din
dreapta \nregistr`ri (re]inute \n variabila s);
11

---

modificarea

c#mpului

de

adres`

la

dreapta

\nregistr`rii din s cu adresa noii \nregistr`ri;


--- s va lua valoarea noii \nregistr`ri, deoarece aceasta va fi
cea mai din dreapta.
3) Ad`ugare la st#nga
Aceast` opera]ie este realizat` de procedura adst. Pentru
ad`ugarea unei \nregistr`ri se realizeaz` urm`toarele opera]ii;
--- citirea informa]iei utile;
--- alocarea spa]iului pentru \nregistrare;
--- completarea adresei la st#nga cu NIL;
--- completarea adresei din dreapta cu adresa celei mai din
st#nga \nregistr`ri (re]inute \n variabila s);
--- modificarea c#mpului de adres` la st#nga a \nregistr`rii
din s cu adresa noii \nregistr`ri;
--- s va lua valoarea noii \nregistr`ri, deoarece aceasta va fi
cea mai din st#nga.
4) Ad`ugare \n interiorul listei
Aceast` opera]ie este realizat` de procedura include, care
realizeaz` urm`toarele opera]ii:
--- parcurge lista de la st#nga la dreapta c`ut#nd
\nregistrarea cu informa]ia util` m, \n dreapta c`reia urmeaz` s`
introducem noua \nregistrare;
--- cite[te informa]ia util`;
--- aloc` spa]iu pentru noua \nregistrare;
--- completeaz` informa]ia util`;
--- adresa st#ng` a noii \nregistr`ri ia valoarea adresei
\nregistr`rii de informa]ie util` m;

12

--- adresa st#ng` a \nregistr`rii care urma la acest moment


\nregistr`rii cu informa]ia util` m cap`t` valoarea adresei noii
\nregistr`ri;
--- adresa dreapt` a noi \nregistr`ri ia valoarea adresei
dreapta a \nregistr`rii cu informa]ia util` m;
--- adresa dreapt` a \nregistr`rii cu informa]ia util` m ia
valoarea noii \nregistr`ri.
5) {tergere \n interiorul listei
Aceast` opera]ie este realizat` de procedura sterg. Opera]iile
efectuate de aceast` procedur` sunt urm`toarele:
--- se parcurge lista de la st#nga la dreapta pentru a ne
pozi]iona pe \nregistrarea care urmeaz` a fi [tears`;
--- c#mpul de adres` dreapta al \nregistr`rii care oprecede
pe aceasta va lua valoarea c#mpului de adres` drepta al
\nregistr`rii care va fi [tears`;
---

c#mpul

de

adres`

st#nga

al

\nregistr`rii

care

urmeaz` \nregistr`rii care va fi [tears` va lua valoarea c#mpului


de adres` st#nga al \nregistr`rii pe care o [tergem;
--- se elibereaz` spa]iul de memorie rezervat \nregistr`rii
care se [terge.
6) Listare de la st#nga la dreapta
Aceast` opera]ie este realizat` de procedura listare, procedur`
care realizeaz` urm`toarele opera]ii:
--- porne[te din st#nga listei;
--- at#t timp c#t nu s-a ajuns la cap`tul din dreapta al
listei, se tip`re[te informa]ia util` [i se trece la \nregistrarea
urm`toare.
13

7) Listare de la dreapta la st#nga


Aceast` opera]ie este realizat` de procedura listare, procedur`
care realizeaz` urm`toarele opera]ii:
--- porne[te din dreapta listei;
--- at#t timp c#t nu s-a ajuns la cap`tul din st#nga al
listei, se tip`re[te informa]ia util` [i se trece la \nregistrarea
urm`toare.

Lista circular`
Se consider` o list` liniar`. Dac`, la ultima \nregistrare,
adresa urm`toare va fi adresa primei \nregistr`ri, am definit o
list` circular`. |n cazul \n care lista ini]ial` este simplu \nl`n]uit`,
lista circular` va fi simplu \nl`n]uit`, iar dac` lista ini]ial` este
dublu \nl`n]uit` [I lista circular` va fi dublu \nl`n]uit`.

Implementarea Pascal a aplica\iei:


program divide_et_impera;
uses crt,dos,graph,liste_pr;
var p:pointer;
i,j:integer;
c:char;
f:boolean;
s:word;
begin
start;
readkey;
cleardevice;
init_cursor(p);
meniu_princ;
14

i:=300;
j:=250;
putimage(i,j,p^,xorput);
repeat
if keypressed then
begin
c:=getkey;
case c of
{sus} #72: if j>4 then
begin
putimage(i,j,p^,xorput);
j:=j-4;
putimage(i,j,p^,xorput);
end;
{jos} #80: if j<460 then
begin
putimage(i,j,p^,xorput);
j:=j+4;
putimage(i,j,p^,xorput);
end;
{st} #75: if i>4 then
begin
putimage(i,j,p^,xorput);
i:=i-4;
putimage(i,j,p^,xorput);
end;
{dr} #77: if i<610 then
begin
putimage(i,j,p^,xorput);
i:=i+4;
putimage(i,j,p^,xorput);
end;
#13: begin
{L. simple} if (i>200)and(i<450)and(j>130)and(j<165) then
begin
beep;
restorecrtmode;
simple;
setgraphmode(2);
meniu_princ;
putimage(i,j,p^,xorput);
end;
{L. duble} if (i>200)and(i<450)and(j>210)and(j<245) then
begin
beep;
15

restorecrtmode;
duble;
setgraphmode(2);
meniu_princ;
putimage(i,j,p^,xorput);
end;
{L. circulare} if (i>200)and(i<450)and(j>290)and(j<335) then
begin
beep;
restorecrtmode;
circulare;
setgraphmode(2);
meniu_princ;
putimage(i,j,p^,xorput);
end;
{Help}
if (i>50)and(i<200)and(j>370)and(j<405) then
begin
beep;
help;
cleardevice;
meniu_princ;
putimage(i,j,p^,xorput);
end;
{About}
if (i>250)and(i<400)and(j>370)and(j<405) then
begin
beep;
about;
cleardevice;
meniu_princ;
putimage(i,j,p^,xorput);
end;
{Exit}
if (i>450)and(i<600)and(j>370)and(j<405) then
begin
beep;
meniu_iesire(f);
c:=#27;
end;
end; {#13}
{ESC} #27: begin end;
end; {case}
end {if} else actualizare_ceas(s);
until c=#27;
fin;
end.
16

unit liste_pr;
interface
uses graph,dos,crt;
type lista=^nod;
nod=record
info:integer;
next:lista;
end;
lista_d=^nod_d;
nod_d=record
info:integer;
ant:lista_d;
post:lista_d;
end;
var gd,gm,d1,d2,d3,i:integer;
c:char;
p:pointer;
procedure beep;
procedure start;
procedure fin;
function getkey:char;
procedure init_cursor(var p:pointer);
procedure buton(x,y:integer;s:string);
procedure buton_mare(x,y:integer;s:string);
procedure meniu_princ;
procedure help;
procedure about;
procedure meniu_iesire(var f:boolean);
procedure actualizare_ceas(var s:word);
procedure simple;
procedure duble;
procedure circulare;
procedure creare_s(var p:lista);
procedure crea_ord_s(var p:lista);
procedure adaug_s(p:lista);
procedure ins_in_s(var p:lista);
procedure ins_dupa_s(p:lista);
procedure stergere_s(var p:lista);
procedure modif_s(p:lista);
procedure afisare_s(p:lista);
procedure creare_d(var p1,p2:lista_d);
procedure adaug_d(var p1,p2:lista_d);
17

procedure inserare_d(var p1,p2:lista_d);


procedure stergere_d(var p1,p2:lista_d);
procedure modif_d(p1,p2:lista_d);
procedure afisare_d(p1,p2:lista_d);
procedure creare_c(var p:lista);
procedure adaug_c(var p:lista);
procedure ins_in_c(var p:lista);
procedure ins_dupa_c(p:lista);
procedure stergere_c(var p:lista);
procedure modif_c(p:lista);
procedure afisare_c(p:lista);
procedure copii;
implementation
procedure simple;
{Liste simplu inlantuite-meniu}
var c:char;
p:lista;
begin
textcolor(13);
repeat
clrscr;
writeln(' ***** L I S T E S I M P L U I N L A N T U I T E ******');
writeln; writeln;
writeln(' ');
writeln('
1. C R E A R E L I S T A
');
writeln(' ');
writeln('
2. C R E A R E L I S T E I O R D O N A T A
');
writeln(' ');
writeln('
3. A D A U G A R E
');
writeln(' ');
writeln('
4. I N S E R A R E A I N A I N T E
');
writeln(' ');
writeln('
5. I N S E R A R E D U P A
');
writeln(' ');
writeln('
6. S T E R G E R E
');
writeln(' ');
writeln('
7. M O D I F I C R E A L I S T E I
');
writeln(' ');
writeln('
8. A F I S A R E A L I S T E I
');
writeln(' ');
writeln(' ESC
');
writeln(' ');
c:=readkey;
18

case c of
'1':creare_s(p);
'2':crea_ord_s(p);
'3':adaug_s(p);
'4':ins_in_s(p);
'5':ins_dupa_s(p);
'6':stergere_s(p);
'7':modif_s(p);
'8':afisare_s(p);
end; {case}
until c=#27; {ESC}
end; {simple}
procedure duble;
{Meniu - liste dublu inlantuite}
var c:char;
p1,p2:lista_d;
begin
textcolor(13);
repeat
clrscr;
writeln(' ***** L I S T E D U B L U I N L A N T U I T E ******');
writeln; writeln;
writeln(' ');
writeln('
1. C R E A R E
');
writeln(' ');
writeln('
2. A D A U G A R E
');
writeln(' ');
writeln('
3. I N S E R A R E
');
writeln(' ');
writeln('
4. S T E R G E R E
');
writeln(' ');
writeln('
5. M O D I F I C A R E
');
writeln(' ');
writeln('
6. A F I S A R E
');
writeln(' ');
writeln(' ESC
');
writeln(' ');
c:=readkey;
case c of
'1':creare_d(p1,p2);
'2':adaug_d(p1,p2);
'3':inserare_d(p1,p2);
'4':stergere_d(p1,p2);
'5':modif_d(p1,p2);
19

'6':afisare_d(p1,p2);
end; {case}
until c=#27; {ESC}
end; {duble}
procedure circulare;
{Meniu - liste circulare}
var c:char;
p:lista;
begin
textcolor(13);
repeat
clrscr;
writeln(' ***** LISTE CIRCULARE SIMPLU INLANTUITE
******');
writeln; writeln;
writeln(' ');
writeln('
1. C R E A R E
');
writeln(' ');
writeln('
2. A D A U G A R E
');
writeln(' ');
writeln('
3. I N S E R A R E I N A I N T E
');
writeln(' ');
writeln('
4. I N S E R A R E D U P A
');
writeln(' ');
writeln('
5. S T E R G E R E
');
writeln(' ');
writeln('
6. M O D I F I C A R E
');
writeln(' ');
writeln('
7. A F I S A R E
');
writeln(' ');
writeln('
8. C O P I I
');
writeln(' ');
writeln(' ESC
');
writeln(' ');
c:=readkey;
case c of
'1':creare_c(p);
'2':adaug_c(p);
'3':ins_in_c(p);
'4':ins_dupa_c(p);
'5':stergere_c(p);
'6':modif_c(p);
'7':afisare_c(p);
'8':copii;
20

end; {case}
until c=#27; {ESC}
end; {circulare}
procedure creare_s(var p:lista);
{creaza o lista simplu inlantuita}
var r,q:lista;
c:char;
begin
new(p);
write('Info=');
readln(p^.info);
p^.next:=nil;
writeln('mai doriti sa introduceti? ../n');
c:=readkey;
while upcase(c)<>'N' do
begin
adaug_s(p);
writeln('mai doriti sa introduceti? ../n');
c:=readkey;
end;
afisare_s(p);
end;{creare_s}
procedure crea_ord_s(var p:lista);
{creaza o lista simplu inlantuita direct ordonata}
var q,r:lista;
k:integer;
begin
new(p);
write('Info=');
readln(p^.info);
p^.next:=nil;
writeln('mai doriti sa introduceti? ../n');
c:=readkey;
while upcase(c)<>'N' do
begin
write('Info=');read(k);
if k<p^.info then
begin
new(r);
r^.info:=k;
r^.next:=p;
p:=r;
end
21

else
begin
q:=p;
while (q^.next^.info<k)and(q^.next<>nil) do q:=q^.next;
{ins dupa}
new(r);
r^.info:=k;
r^.next:=q^.next;
q^.next:=r;
end;
writeln('mai doriti sa introduceti? ../n');
c:=readkey;
end;
afisare_s(p);
end; {crea_ord_s}
procedure adaug_s(p:lista);
{adauga la sfarsitul listei}
var q,r:lista;
begin
q:=p;
while (q^.next<>nil) do q:=q^.next;
new(r);
write('Info:');read(r^.info);
r^.next:=nil;
q^.next:=r;
end; {adaug_s}
procedure ins_in_s(var p:lista);
{inserare inaintea unui element}
var q,r:lista;
k,i:integer;
begin
q:=p;
write('Poz =');read(k);
write('Info=');
for i:=1 to k-1 do
q:=q^.next;
new(r);
r^.info:=q^.info;
read(q^.info);
r^.next:=q^.next;
q^.next:=r;
afisare_s(p);
end; {ins_in_s}
22

procedure ins_dupa_s(p:lista);
{inserare dupa un element}
var q,r:lista;
k,i:integer;
begin
q:=p;
write('Poz =');read(k);
write('Info=');
for i:=1 to k-1 do
q:=q^.next;
new(r);
read(r^.info);
r^.next:=q^.next;
q^.next:=r;
afisare_s(p);
end; {ins_dupa_s}
procedure stergere_s(var p:lista);
{sterge un element din lista}
var q,r:lista;
k,i:integer;
begin
write('Poz =');read(k);
if k=1 then
begin
r:=p;
p:=p^.next;
dispose(r);
end
else
begin
q:=p;
for i:=1 to k-2 do
q:=q^.next;
r:=q^.next;
q^.next:=q^.next^.next;
dispose(r);
end;
afisare_s(p);
end; {stergere_s}
procedure modif_s(p:lista);
{modifica informatia dintr-o celula}
var q,r:lista;
23

k,i:integer;
begin
write('Poz =');read(k);
write('Info=');
if k=1 then read(p^.info)
else
begin
q:=p;
for i:=1 to k-1 do
q:=q^.next;
read(q^.info);
end;
afisare_s(p);
end; {modif_s}
procedure afisare_s(p:lista);
{afiseaza lista simplu inlantuita}
var q:lista;
begin
q:=p;
writeln('Elementele listei sunt: ');
while q<>NIL do
begin
write(q^.info:7);
q:=q^.next;
end;
readkey;
end;{afisare_s}
procedure creare_d(var p1,p2:lista_d);
{creaza o lista dublu inlantuita}
var r,q:lista_d;
c:char;
begin
new(p1);
write('Info=');
readln(p1^.info);
p1^.post:=nil;
p1^.ant:=nil;
p2:=p1;
writeln('mai doriti sa introduceti? ../n');
c:=readkey;
while upcase(c)<>'N' do
begin
24

adaug_d(p1,p2);
writeln('mai doriti sa introduceti? ../n');
c:=readkey;
end;
afisare_d(p1,p2);
end; {creare_d}
procedure adaug_d(var p1,p2:lista_d);
{adauga un nou element la sf listei}
var q:lista_d;
begin
new(q);
write('Info= ');read(q^.info);
q^.post:=nil;
p2^.post:=q;
q^.ant:=p2;
p2:=q;
end; {adaug_d}
procedure inserare_d(var p1,p2:lista_d);
{insereaza un element pe pozitia k}
var q,r:lista_d;
k,i:integer;
begin
write('Poz =');read(k);
if k=1 then
begin
new(r);
write('Info= ');
read(r^.info);
r^.ant:=nil;
r^.post:=p1;
p1^.ant:=r;
p1:=r;
end
else
begin
write('Info=');
q:=p1;
for i:=1 to k-2 do
q:=q^.post;
new(r) ;
read(r^.info);
r^.post:=q^.post;
r^.ant:=q;
25

q^.post^.ant:=r;
q^.post:=r;
end;
afisare_d(p1,p2);
end; {inserare_d}
procedure stergere_d(var p1,p2:lista_d);
{sterge un element din lista de pe pozitia k}
var q,r:lista_d;
k,i:integer;
begin
write('Poz =');read(k);
if k=1 then
begin
q:=p1^.post;
dispose(p1);
p1:=q;
p1^.ant:=nil;
end
else
begin
q:=p1;
for i:=1 to k-1 do
q:=q^.post;
q^.post^.ant:=q^.ant;
q^.ant^.post:=q^.post;
dispose(q);
end;
afisare_d(p1,p2);
end; {stergere_d}
procedure modif_d(p1,p2:lista_d);
{modifica informatia dintr-o celula}
var q,r:lista_d;
k,i:integer;
begin
write('Poz =');read(k);
write('Info=');
if k=1 then read(p1^.info)
else
begin
q:=p1;
for i:=1 to k-1 do
q:=q^.post;
read(q^.info);
26

end;
afisare_d(p1,p2);
end; {modif_d}
procedure afisare_d(p1,p2:lista_d);
{afiseaza lista dublu inlantuita}
var q:lista_d;
begin
q:=p1;
writeln('Elementele listei sunt: ');
while q<>NIL do
begin
write(q^.info:7);
q:=q^.post;
end;
readkey;
end; {afisare_d}
procedure creare_c(var p:lista);
{creaza o lista circulara}
var r,q:lista;
c:char;
begin
new(p);
write('Info=');
readln(p^.info);
p^.next:=p;
writeln('mai doriti sa introduceti? ../n');
c:=readkey;
while upcase(c)<>'N' do
begin
adaug_c(p);
writeln('mai doriti sa introduceti? ../n');
c:=readkey;
end;
afisare_c(p);
end; {creare_c}
procedure adaug_c(var p:lista);
{adauga un element in lista (inainte de p)}
var q:lista;
begin
new(q);
q^.info:=p^.info;
write('Info='); readln(p^.info);
27

q^.next:=p^.next;
p^.next:=q;
p:=q;
end; {adaug_c}
procedure ins_in_c(var p:lista);
{insereaza un element inainte}
var q,r:lista;
k,i:integer;
begin
q:=p;
write('Poz =');read(k);
write('Info=');
for i:=1 to k-1 do
q:=q^.next;
new(r);
r^.info:=q^.info;
read(q^.info);
r^.next:=q^.next;
q^.next:=r;
afisare_c(p);
end; {ins_in_c}
procedure ins_dupa_c(p:lista);
{inserare dupa un element}
var q,r:lista;
k,i:integer;
begin
q:=p;
write('Poz =');read(k);
write('Info=');
for i:=1 to k-1 do
q:=q^.next;
new(r);
read(r^.info);
r^.next:=q^.next;
q^.next:=r;
afisare_c(p);
end; {ins_in_c}
procedure stergere_c(var p:lista);
{sterge un element din lista}
var q,r:lista;
k,i,j:integer;
begin
28

write('Poz =');read(k);
j:=0;
if k=1 then begin k:=k+1; j:=1; end;
q:=p;
for i:=1 to k-2 do q:=q^.next;
r:=q^.next;
if j=1 then p:=q^.next^.next;
q^.next:=q^.next^.next;
dispose(r);
afisare_c(p);
end; {stergere_c}
procedure modif_c(p:lista);
{modifica informatia dintr-o celula}
var q,r:lista;
k,i:integer;
begin
write('Poz =');read(k);
write('Info=');
if k=1 then read(p^.info)
else
begin
q:=p;
for i:=1 to k-1 do
q:=q^.next;
read(q^.info);
end;
afisare_c(p);
end; {modif_c}
procedure afisare_c(p:lista);
{afiseaza lista circulara}
var q:lista;
begin
q:=p;
writeln('Elementele listei sunt: ');
while q^.next<>p do
begin
write(q^.info:7);
q:=q^.next;
end;
write(q^.info:7);
readkey;
end; {afisare_c}
29

procedure copii;
{aplicatie la lista circulara}
var p,q,r:lista;
i,n,k:integer;
begin
clrscr;
write('Numarul de copii=');readln(n);
write('k=');readln(k);
for i:=1 to n do
if i=1 then
begin
new(p);
write('info:');readln(p^.info);
p^.next:=nil;
q:=p;
end
else
begin
new(r);
write('info:');readln(r^.info);
q^.next:=r;
r^.next:=nil;
q:=r;
end;
writeln;
q^.next:=p;
q:=p;
while (q<>q^.next) do
begin
write(q^.info,' ');
q^.info:=q^.next^.info;
r:=q^.next;
q^.next:=q^.next^.next;
dispose(r);
for i:=1 to k-1 do
q:=q^.next;
end;
writeln('castigatorul: ',q^.info);
dispose(q);
readkey;
end; {copii}
procedure beep;
begin
30

sound(5000);delay(50);nosound;
sound(800); delay(100);nosound;
end; {beep}
procedure start;
{initializeaza modul grafic}
begin
gd:=detect;
initgraph(gd,gm,'c:\util\bp7\bgi');
setlinestyle(0,0,3);
rectangle(0,0,640,480);
setlinestyle(0,0,1);
rectangle(4,4,636,476);
setbkcolor(1);
setfillstyle(11,9);
bar(50,50,590,410);
setcolor(15);
settextstyle(4,0,8);
outtextxy(120,50,'L I S T E');
settextstyle(4,0,7);
outtextxy(100,130,'Simple & Duble');
settextstyle(1,0,4);
outtextxy(200,420,'Craiova - 2002');
settextstyle(6,0,3);
outtextxy(380,250,'Absolvent:');
outtextxy(430,280,'Cristian Catan');
outtextxy(380,310,'Profesor:');
outtextxy(430,340,'Predesel Elena');
end; {start}
procedure fin;
{sfarsit program}
begin
closegraph;
gotoxy(20,20);
write('Colegiul National "Fratii Buzesti" - Craiova 2002');
readkey;
end; {fin}
function getkey:char;
{citeste o tasta}
var c:char;
begin
c:=readkey;
if c=#0 then c:=readkey;
31

getkey:=c;
end; {getkey}
procedure init_cursor(var p:pointer);
{deseneaza cursorul si il salveaza in pointerul p}
var size:word;
begin
{sageata}
moveto(300,300);
lineto(325,309);
lineto(308,309);
lineto(304,315);
lineto(300,300);
moveto(303,304);
lineto(311,307);
lineto(307,307);
lineto(305,309);
lineto(303,304);
setfillstyle(1,green);
floodfill(305,304,15);
Size:=ImageSize(300,300,325,315);
GetMem(p,Size);
{ Allocate memory on heap }
GetImage(300,300,325,315,p^);
setfillstyle(1,0);
bar(300,300,325,315);
end;{init_cursor}
procedure buton(x,y:integer;s:string);
{deseneaza un buton cu coltul st-sus in coord x,y de marime 150x35}
begin
setcolor(15);
rectangle(x,y,x+150,y+35);
rectangle(x+4,y+4,x+146,y+31);
line(x,y,x+4,y+4);
line(x+146,y+31,x+150,y+35);
setfillstyle(1,15);
floodfill(x+2,y+10,15);
setfillstyle(1,8);
floodfill(x+10,y+2,15);
setfillstyle(1,7);
floodfill(x+10,y+10,15);
settextstyle(1,0,2);
setcolor(0);
outtextxy(x+10,y+5,s);
end; {buton}
32

procedure buton_mare(x,y:integer;s:string);
{deseneaza un buton cu coltul st-sus in coord x,y de marime 250x35}
begin
setcolor(15);
rectangle(x,y,x+250,y+35);
rectangle(x+4,y+4,x+246,y+31);
line(x,y,x+4,y+4);
line(x+246,y+31,x+250,y+35);
setfillstyle(1,15);
floodfill(x+2,y+10,15);
setfillstyle(1,8);
floodfill(x+10,y+2,15);
setfillstyle(1,7);
floodfill(x+10,y+10,15);
settextstyle(1,0,2);
setcolor(0);
outtextxy(x+10,y+5,s);
end; {buton}
procedure meniu_princ;
{ des. chenarul si butoanele }
var s1,s2,s3:string;
h,m,s,l:word;
begin
cleardevice;
{chenar}
setlinestyle(0,0,3);
rectangle(0,0,640,480);
setlinestyle(0,0,1);
rectangle(4,4,636,476);
{butoane}
setbkcolor(1);
buton_mare(200,130,'Liste simplu inlantuite');
buton_mare(200,210,'Liste dublu inlantuite');
buton_mare(200,290,' Liste circulare');
buton(250,370,' About');
buton( 50,370,' Help');
buton(450,370,' Exit');
{titlu}
setcolor(15);
settextstyle(4,0,6);
outtextxy(20,40,'LISTE');
settextstyle(4,0,5);
outtextxy(200,50,' implementare dinamic');
33

{data+ceas}
settextstyle(2,0,5);
rectangle(370,20,620,40);
getdate(h,m,s,l);
case l of
1 : outtextxy(380,22,' Luni');
2 : outtextxy(380,22,' Marti');
3 : outtextxy(380,22,'Miercuri');
4 : outtextxy(380,22,' Joi');
5 : outtextxy(380,22,'Vineri');
6 : outtextxy(380,22,'Sambata');
7 : outtextxy(380,22,'Duminica');
end;{case}
str(s,s1); str(m,s2); str(h,s3);
s1:=s1+'.'+s2+'.'+s3;
outtextxy(450,22,s1);
s:=80;
actualizare_ceas(s);
end; {meniu_princ}
procedure help;
{ afiseaza un text ajutator }
var a,b:integer;
begin
cleardevice;
setlinestyle(0,0,3);
rectangle(0,0,640,480);
setlinestyle(0,0,1);
rectangle(4,4,636,476);
settextstyle(10,0,1);
outtextxy(110,15,'L i s t e - Online Help');
settextstyle(2,0,6);
i:=1;
outtextxy(50,450,'Page of 3' );
outtextxy(350,450,'PageUp \ PageDown \ ESC' );
line(5,447,635,447);
outtextxy(100,450,'1');
{titlu}
setcolor(7);
settextstyle(1,0,2);
outtextxy(200,70,'Prezentare generala:');
{text}
setcolor(15);
settextstyle(2,0,6);
outtextxy(50,100,' Listele sunt structuri de date omogene de forma:');
34

outtextxy(50,180,' Adresa de sfarsit a listei este NIL=adresa vida.');


outtextxy(50,200,' Adresa de inceput se noteaza cu P=capul listei.');
outtextxy(50,220,'Cand adresa de sfarsit coincide cu capul listei lista');
outtextxy(50,240,'se numeste circulara.');
outtextxy(50,260,' Un nod al listei este format');
outtextxy(50,280,'dintr-o parte de informatie si o');
outtextxy(50,300,'legatura catre urmatorul nod:');
outtextxy(50,320,' Daca legatura este dubla, atat catre nodul precedent');
outtextxy(50,340,'cat si catre urmatorul, lista este dublu inlantuita.');
{figura1}
circle(100,140,2);
circle(200,140,2);
outtextxy(90,120,'p');
outtextxy(190,120,'q');
outtextxy(505,160,'NIL');
rectangle(100,140,130,160);
line(125,140,125,160);
line(108,145,118,145);
line(108,150,118,150);
line(108,155,118,155);
ellipse(140,160,180,360,10,5);
rectangle(150,140,180,160);
line(175,140,175,160);
line(158,145,168,145);
line(158,150,168,150);
line(158,155,168,155);
ellipse(190,160,180,360,10,5);
rectangle(200,140,230,160);
line(225,140,225,160);
line(208,145,218,145);
line(208,150,218,150);
line(208,155,218,155);
ellipse(240,160,180,360,10,5);
rectangle(450,140,480,160);
line(475,140,475,160);
line(458,145,468,145);
line(458,150,468,150);
line(458,155,468,155);
line(480,160,490,160);
line(490,160,490,170);
setfillstyle(1,7);
bar(480,170,500,175);
setlinestyle(3,0,1);
line(250,158,440,158);
{figura2}
35

line(250,398,430,398);
line(250,380,430,380);
setlinestyle(0,0,1);
circle(100,400,2);
circle(200,380,2);
circle(480,380,2);
outtextxy(80,400,'p1');
outtextxy(490,360,'p2');
outtextxy(200,355,'q');
outtextxy(505,400,'NIL');
outtextxy(60,370,'NIL');
rectangle(100,380,130,400);
line(125,380,125,400);
line(105,380,105,400);
line(110,385,120,385);
line(110,390,120,390);
line(110,395,120,395);
ellipse(140,400,180,360,10,5);
ellipse(140,380,0,180,10,5);
rectangle(150,380,180,400);
line(175,380,175,400);
line(155,380,155,400);
line(160,385,170,385);
line(160,390,170,390);
line(160,395,170,395);
ellipse(190,400,180,360,10,5);
ellipse(190,380,0,180,10,5);
rectangle(200,380,230,400);
line(225,380,225,400);
line(205,380,205,400);
line(210,385,220,385);
line(210,390,220,390);
line(210,395,220,395);
ellipse(240,400,180,360,10,5);
ellipse(240,380,0,180,10,5);
rectangle(450,380,480,400);
line(475,380,475,400);
line(455,380,455,400);
line(460,385,470,385);
line(460,390,470,390);
line(460,395,470,395);
ellipse(440,400,180,360,10,5);
ellipse(440,380,0,180,10,5);
{nil}
line(480,400,490,400);
36

line(490,400,490,410);
setfillstyle(1,7);
bar(480,410,500,415);
line(90,380,100,380);
line(90,370,90,380);
bar(80,365,100,370);
{figura 3}
settextstyle(2,0,5);
rectangle(450,270,500,300);
circle(450,270,3);
line(485,270,485,300);
line(458,278,478,278);
line(458,283,478,283);
line(458,288,478,288);
line(458,293,478,293);
outtextxy(380,250,'adresa');
outtextxy(370,260,'de inceput');
line(460,260,480,285);
line(475,285,480,285);
line(480,280,480,285);
outtextxy(450,240,'informatie');
ellipse(512,300,180,360,12,7);
outtextxy(530,280,' adresa');
outtextxy(530,290,'urmatoare');
settextstyle(2,0,6);
readkey;
repeat
if keypressed then
begin
c:=getkey;
case c of
{PgUp} #73 :if i>1 then
begin
setfillstyle(1,0);
bar(30,60,600,440);
i:=i-1;
case i of
1: begin
bar(90,450,110,470);
outtextxy(100,450,'1');
{titlu}
setcolor(7);
settextstyle(1,0,2);
outtextxy(200,70,'Prezentare generala:');
{text}
37

setcolor(15);
settextstyle(2,0,6);
outtextxy(50,100,' Listele sunt structuri de date omogene de
forma:');
outtextxy(50,180,' Adresa de sfarsit a listei este NIL=adresa
vida.');
outtextxy(50,200,' Adresa de inceput se noteaza cu P=capul
listei.');
outtextxy(50,220,'Cand adresa de sfarsit coincide cu capul
listei lista');
outtextxy(50,240,'se numeste circulara.');
outtextxy(50,260,' Un nod al listei este format');
outtextxy(50,280,'dintr-o parte de informatie si o');
outtextxy(50,300,'legatura catre urmatorul nod:');
outtextxy(50,320,' Daca legatura este dubla, atat catre nodul
precedent');
outtextxy(50,340,'cat si catre urmatorul, lista este dublu
inlantuita.');
{figura1}
circle(100,140,2);
circle(200,140,2);
outtextxy(90,120,'p');
outtextxy(190,120,'q');
outtextxy(505,160,'NIL');
rectangle(100,140,130,160);
line(125,140,125,160);
line(108,145,118,145);
line(108,150,118,150);
line(108,155,118,155);
ellipse(140,160,180,360,10,5);
rectangle(150,140,180,160);
line(175,140,175,160);
line(158,145,168,145);
line(158,150,168,150);
line(158,155,168,155);
ellipse(190,160,180,360,10,5);
rectangle(200,140,230,160);
line(225,140,225,160);
line(208,145,218,145);
line(208,150,218,150);
line(208,155,218,155);
ellipse(240,160,180,360,10,5);
rectangle(450,140,480,160);
line(475,140,475,160);
line(458,145,468,145);
38

line(458,150,468,150);
line(458,155,468,155);
line(480,160,490,160);
line(490,160,490,170);
setfillstyle(1,7);
bar(480,170,500,175);
setlinestyle(3,0,1);
line(250,158,440,158);
{figura2}
line(250,398,430,398);
line(250,380,430,380);
setlinestyle(0,0,1);
circle(100,400,2);
circle(200,380,2);
circle(480,380,2);
outtextxy(80,400,'p1');
outtextxy(490,360,'p2');
outtextxy(200,355,'q');
outtextxy(505,400,'NIL');
outtextxy(60,370,'NIL');
rectangle(100,380,130,400);
line(125,380,125,400);
line(105,380,105,400);
line(110,385,120,385);
line(110,390,120,390);
line(110,395,120,395);
ellipse(140,400,180,360,10,5);
ellipse(140,380,0,180,10,5);
rectangle(150,380,180,400);
line(175,380,175,400);
line(155,380,155,400);
line(160,385,170,385);
line(160,390,170,390);
line(160,395,170,395);
ellipse(190,400,180,360,10,5);
ellipse(190,380,0,180,10,5);
rectangle(200,380,230,400);
line(225,380,225,400);
line(205,380,205,400);
line(210,385,220,385);
line(210,390,220,390);
line(210,395,220,395);
ellipse(240,400,180,360,10,5);
ellipse(240,380,0,180,10,5);
rectangle(450,380,480,400);
39

line(475,380,475,400);
line(455,380,455,400);
line(460,385,470,385);
line(460,390,470,390);
line(460,395,470,395);
ellipse(440,400,180,360,10,5);
ellipse(440,380,0,180,10,5);
{nil}
line(480,400,490,400);
line(490,400,490,410);
setfillstyle(1,7);
bar(480,410,500,415);
line(90,380,100,380);
line(90,370,90,380);
bar(80,365,100,370);
{figura 3}
settextstyle(2,0,5);
rectangle(450,270,500,300);
circle(450,270,3);
line(485,270,485,300);
line(458,278,478,278);
line(458,283,478,283);
line(458,288,478,288);
line(458,293,478,293);
outtextxy(380,250,'adresa');
outtextxy(370,260,'de inceput');
line(460,260,480,285);
line(475,285,480,285);
line(480,280,480,285);
outtextxy(450,240,'informatie');
ellipse(512,300,180,360,12,7);
outtextxy(530,280,' adresa');
outtextxy(530,290,'urmatoare');
settextstyle(2,0,6);
end;
2: begin
bar(90,450,110,470);
outtextxy(100,450,'2');
{titlu}
setcolor(7);
settextstyle(1,0,2);
outtextxy(200,70,'Implementare - Operatii specifice');
{text}
setcolor(15);
settextstyle(2,0,6);
40

outtextxy(50,100,' Pentru implementare putem folosi


varianta statica');
outtextxy(50,120,'sau varianta dinamica. In implementarea
statica avem');
outtextxy(50,140,'ca avantaj accesul direct la elemente si
dezavantaje');
outtextxy(50,160,'limitarea numarului de elemente, consumul
inutil de ');
outtextxy(50,180,'memorie, deplasarea elementelor in cazul
operatiilor');
outtextxy(50,200,'de inserare si stergere.');
outtextxy(50,220,' In implementarea dinamica numarul
elementelor este');
outtextxy(50,240,'limitat numai de memoria calculatorului,
este folosita');
outtextxy(50,260,'memoria numai cat e necesar, operatiile de
stergere si');
outtextxy(50,280,'inserare se fac fara operatii suplimentare, in
schimb');
outtextxy(50,300,'se permite numai accesul secvential la
elemente.');
outtextxy(50,320,'
OPERATII SPECIFICE:');
outtextxy(50,340,' - crearea unei liste');
outtextxy(50,360,' - parcurgerea si afisarea (conditionata)');
outtextxy(50,380,' - adaugarea la sfarsitul listei');
outtextxy(50,400,' - inserarea inainte sau dupa pozitia
curenta');
outtextxy(50,420,' - stergerea unui element');
{figura}
end;
end;
end;
{PgDn} #81 :if i<3 then
begin
setfillstyle(1,0);
bar(30,60,600,440);
i:=i+1;
case i of
2: begin
bar(90,450,110,470);
outtextxy(100,450,'2');
{titlu}
setcolor(7);
settextstyle(1,0,2);
outtextxy(200,70,'Implementare - Operatii specifice');
41

{text}
setcolor(15);
settextstyle(2,0,6);
outtextxy(50,100,' Pentru implementare putem folosi
varianta statica');
outtextxy(50,120,'sau varianta dinamica. In implementarea
statica avem');
outtextxy(50,140,'ca avantaj accesul direct la elemente si
dezavantaje');
outtextxy(50,160,'limitarea numarului de elemente, consumul
inutil de ');
outtextxy(50,180,'memorie, deplasarea elementelor in cazul
operatiilor');
outtextxy(50,200,'de inserare si stergere.');
outtextxy(50,220,' In implementarea dinamica numarul
elementelor este');
outtextxy(50,240,'limitat numai de memoria calculatorului,
este folosita');
outtextxy(50,260,'memoria numai cat e necesar, operatiile de
stergere si');
outtextxy(50,280,'inserare se fac fara operatii suplimentare, in
schimb');
outtextxy(50,300,'se permite numai accesul secvential la
elemente.');
outtextxy(50,320,'
OPERATII SPECIFICE:');
outtextxy(50,340,' - crearea unei liste');
outtextxy(50,360,' - parcurgerea si afisarea (conditionata)');
outtextxy(50,380,' - adaugarea la sfarsitul listei');
outtextxy(50,400,' - inserarea inainte sau dupa pozitia
curenta');
outtextxy(50,420,' - stergerea unui element');
{figura}
end;
3: begin
bar(90,450,110,470);
outtextxy(100,450,'3');
{titlu}
setcolor(7);
settextstyle(1,0,2);
outtextxy(200,70,'Tipuri de probleme:');
{text}
setcolor(15);
settextstyle(2,0,6);
outtextxy(50,100,' Pentru implementarea structurilor
arborescente si a');
42

outtextxy(50,120,'grafurilor putem folosi listele de adiacenta.


Acestea ');
outtextxy(50,140,'contin ca informatii vecinii fiecarui nod si
legatura ');
outtextxy(50,160,'catre nodul urmator.');
outtextxy(50,180,' Daca dorim sa ordonam elementele unei
liste, deoarece');
outtextxy(50,200,'nu avem acces direct la elemente este mult
mai bine sa');
outtextxy(50,220,'cream lista direct ordonata (sortare prin
inserare).');
outtextxy(50,240,' Folosind listele circulare putem rezolva
problema:');
outtextxy(50,260,' Un grup de n copii se tin de mana si
numara din k in ');
outtextxy(50,280,'k, copiii numarati sunt eliminati din joc. Sa
se afiseze');
outtextxy(50,300,'ordinea in care sunt eliminati si castigatorul
jocului,');
outtextxy(50,320,'ultimul copil ramas in joc.');
outtextxy(50,360,'
Va multumim!');
end;
end;
end;
end; {case}
end; {if}
until c=#27;
end; {help}
procedure about;
{informatii despre autor}
var i:integer;
begin
{chenar}
bar(220,160,420,320);
rectangle(220,160,420,320);
rectangle(224,164,416,316);
{scris}
settextstyle(1,0,2);
outtextxy(290,165,'LISTE');
settextstyle(1,0,1);
outtextxy(230,183,'- impl. dinamica -');
settextstyle(2,0,7);
outtextxy(250,200,'Absolvent:');
outtextxy(250,260,'Profesor:');
43

settextstyle(2,0,6);
outtextxy(270,220,'Catan Cristi');
outtextxy(270,240,'Cls. XII H');
outtextxy(270,280,'Predesel Elena');
settextstyle(2,0,5);
{sterge}
delay(2000);
randomize;
for i:=1 to 32000 do
putpixel(224+random(192),164+random(152),1);
bar(224,164,416,316);
delay(500);
end; {about}
procedure meniu_iesire(var f:boolean);
{}
begin
end; {meniu_iesire}
procedure actualizare_ceas(var s:word);
{afiseaza ceasul cand se schimba secunda}
var h,m,sec,sut:word;
s1,s2,s3:string;
begin
gettime(h,m,sec,sut);
if sec<>s then
begin
s:=sec;
str(h,s1); str(m,s2); str(sec,s3);
s1:=s1+':'+s2+':'+s3;
setfillstyle(1,1);
bar(520,22,600,38);
outtextxy(530,22,s1);
end;
end; {actualizare_ceas}
begin {initializari}
end.

44

Bibliografia:

1.
2.
3.
4.

Tudor Sorin

Informatica, clasa a IX-a Editura L&S

Tudor Sorin

Infomat, Bucuresti 2000


Informatica, clasa a X-a Editura L&S

Leon Livovski

Infomat, Bucuresti 2001


Analiza ]i sinteza algoritmilor, Editura }

Knuth D.E.

tiin\ific[ si Enciclopedic[, Bucure]ti 1986


Tratat de programare a calculatoarelor,
algoritmi fundamentali, Editura Tehnic[,
45

5.

6.

Eugen Popescu,

Bucure]ti 1984
Limbajul Pascal

Ecaterina Ursache,

programare, Editura Else, Craiova, 2002

Mihaela Paciug[
*******

Gazeta de Informatic[ Nr. 3..7 / 2001

46

&

Tehnici

de

Você também pode gostar