CATEGORII DOCUMENTE |
Limbajele de programare reprezinta unul din principalele mijloace de comunicare om-masina, evolutia lor fiind nemijlocit legata de cea a calculatoarelor electronice, a caror era incepe in 1944. Primele calculatoare puteau fi programate numai in limbaj masina, dar, chiar la inceputul anilor '50, se inregistreaza trecerea la programarea simbolica, prin aparitia limbajelor de asamblare caracterizate prin folosirea codurilor mnemonice pentru instructiuni si a adresarii simbolice a operanzilor. Dupa aparitia primului limbaj de nivel inalt, limbajul FORTRAN (1954), se observa o proliferare accelerata a limbajelor de programare. Intr-o lista considerata exhaustiva la data respectiva (1969), J.E. Sammet identifica 120 de limbaje de programare cu o larga utilizare; trei ani mai tarziu, acelasi autor extindea aceasta lista la 170 [Dodescu et al., 1987]. In primii ani ai deceniului opt, un sondaj efectuat in S.U.A. identifica, la nivelul unui singur domeniu de activitate - sistemele informatice ale armatei americane - utilizarea a peste 450 de limbaje de programare sau dialecte ale unor limbaje.
Din acest
adevarat 'turn al lui
Aparitia limbajului Pascal este un rezultat al conceptelor dezvoltate ca urmare a crizei programarii ce caracteriza domeniul programarii calculatoarelor la sfarsitul anilor '60. In aceasta perioada, raspandirea pe plan mondial a prelucrarii automate a datelor a cunoscut o extindere remarcabila, trecandu-se la abordarea si rezolvarea unor probleme din ce in ce mai complexe. Programele mari asociate acestor probleme s-au complicat in asa masura incat au devenit foarte greu accesibile, chiar si pentru autorii lor. Intelegerea, depanarea si dezvoltarea unor astfel de programe prezinta dificultati majore. Limitarile limbajelor de programare cu larga utilizare in epoca (FORTRAN, COBOL etc.), dublata de inexistenta unor principii clare, care sa impuna o disciplina a programarii, au favorizat in mare masura programarea empirica. Ca raspuns la cerinta de elaborare a unei metodologii generale de dezvoltare sistematica a programelor s-a cristalizat metoda proiectarii si programarii structurate.
Un program structurat este constituit din unitati functionale bine conturate, ierarhizate conform naturii intrinseci a problemei. In interiorul unor astfel de unitati, structura se manifesta atat la nivelul actiunilor (instructiunilor), cat si al datelor.
Programarea structurata este o metoda independenta de limbajul de programare, actionand la nivelul stilului de lucru. Totusi, practica a demonstrat ca limbajul de programare poate inlesni in mod hotarator realizarea desideratelor evidentiate. Limbajul Pascal reprezinta un exemplu edificator in acest sens. El a aparut intr-o forma preliminara in 1968, autorul sau fiind profesorul elvetian Niklaus Wirth. Numele limbajului a fost ales ca un omagiu adus marelui matematician, fizician, filosof si scriitor francez Blaise Pascal (1623-1662), primul care, in 1642, a inventat o masina de calcul. Dupa o faza de dezvoltare extensiva, un prim compilator devine operational in 1970, limbajul fiind publicat in 1971. Interesul trezit de aparitia sa a condus la necesitatea unor consolidari ale limbajului, finalizate prin publicarea in 1973 a unui raport revizuit, in care se realizeaza o definire a formei de referinta numita Pascal Standard, redactata ulterior conform normelor ISO si devenita baza comuna pentru diverse implementari.
Limbajul Pascal include conceptele programarii structurate in ambele laturi ale efortului de abstractizare presupus de realizarea unui program - organizarea datelor si conceperea actiunilor. Printre principalele caracteristici ale lui pot fi mentionate:
. Include o serie de instructiuni care reprezinta chiar structurile de control impuse de tehnica programarii structurate (IF-THEN-ELSE, CASE, REPEAT, WHILE, FOR).
. Are facilitati puternice si deosebit de flexibile pentru reprezentarea datelor. Notiunea de tip de date a fost extinsa dincolo de cercul restrans al datelor intregi, reale, siruri de caractere si tablouri (masive). S-au introdus structuri de date complexe, ca articolul (inregistrarea), multimea, fisierul si posibilitati de a descrie altele noi, combinandu-le pe cele existente. La acestea se adauga facili-tatea de a defini si manipula structuri dinamice (liste liniare, arbori etc.). In anumite implementari ale limbajului a fost introdus tipul obiect, care permite reunirea in aceeasi constructie a datelor si metodelor care le prelucreaza (proceduri si functii), creand cadrul trecerii la programarea orientata obiect (POO).
. Ofera posibilitati de modularizare a programe-lor, prin structurarea lor in module carora le pot fi asociate constructii ale limbajului (proceduri si functii).
. Fundamenteaza constructiile pe conceptul de bloc, care permite, pe de o parte, definirea de date proprii (variabile locale) si, pe de alta parte, accesul la datele din blocurile de pe nivelurile superioare (variabile globale).
. Poseda o biblioteca bogata de functii si proceduri standard, cu elemente specifice diverselor implementari ale limbajului si permite, totodata, construirea de biblioteci ale utilizatorului.
Aceste caracteristici au facut ca, desi conceput initial pentru a servi ca suport de studiu al progra-marii structurate, limbajul sa fie folosit intens si de catre programatorii profesionisti. Ca efect, s-a ajuns rapid la o crestere spectaculoasa a productivi-tatii muncii de programare, ducand la raspandirea utilizarii limbajului.
Limbajul
Pascal beneficiaza de implementari pe
toate tipurile de sisteme de calcul. Multe dintre aceste implementari marcheaza
si dezvoltari ale limbajului insusi, adica in raport cu care Pascal Standard apare ca un subset. Dintre variantele
utilizate de informaticienii romani pot fi mentionate: implementarea pe
calculatoarele din generatia a treia din familia FELIX, din 1978; Pascal
Firma
Borland a realizat, incepand cu 1983, medii integrate de dezvoltare (IDE -
Integrated Development Environment) cu denumirile generice Turbo Pascal ,
Borland Pascal si
Versiunile
din categoria Turbo Pascal sunt
destinate utilizarii sub DOS. Pentru dezvoltarea de aplicatii Windows a fost
lansata implementarea Borland Pascal 7.0
pentru Windows, cu posibilitati superioare de utilizare a POO. Ultima realizare
a firmei Borland o reprezinta
Daca in cazul implementarilor pe 16 biti apare limitarea importanta a dimensiunii segmentelor de date si de cod la 64 KB (spatiul maxim de adrese care poate fi gestionat cu un cuvant de 16 biti), trecerea la cod pe 32 de biti face ca limitarile sa fie impuse numai de sistemul de operare (2 GB la Windows 95).
Definitie:
Se numeste graf neorientat, o pereche ordonata de multimi notata G=(X,U), unde X= este o multime finite si nevida de elemnte numite noduri sau varfuri, iar U= este o multime de perechi neordonate de elemente din X numite muchii.
Asadar un neorientat poate fi reprezentat sub forma unei figure geometrice alcatuite din puncte(noduri,varfuri) si linii drepte sau curbe care unesc aceste puncte (muchii,arce).
Exemplu:
G=(X,U) X= U=
Pentru o muchie
varfurile
x si y sunt adiacente si
se numesc extremitatile muchiei
muchia
muchia (x,y) este totuna cu (y,x) (nu exista o orientare a muchiei);
Doua muchii care au o extremitate comuna se numesc incidente.
Definitie:
Gradul unui varf x, notat d(x), reprezinta numarul muchiilor care trec prin nodul x (incidente cu nodul x).
Exemplu: d(1)=3, d(2)=2, d(4)=0, d(5)=1.
Un varf care are gradul 0 se numeste varf izolat(de exemplu varful 4).
Un varf care are gradul 1 se numeste varf terminal(de exemplu varful 5).
Propozitie:
Fie G=(X,U) un graf neorientat cu n noduri si m muchii, suma gradelor tuturor nodurilor este egala cu 2m.
Intr-un graf neorientat numarul nodurilor de grad impar este un numar par.
Se numeste graf partial al grafului G=(X,U) un graf neorientat G'=(X,V), unde V X. Altfel spus, un graf G' a lui G, este chiar G sau se obtine din G pastrand toate varfurile si suprimand niste muchii.
Se numeste subgraf al grafului G=(X,U) ungraf neorientat H=(Y,V), unde Y X iar V contine toate muchiile din U care au ambele extremitati in multimea Y.
Cele mai cunoscute forme de reprezentare ale unui astfel de graf sunt: matricea de adiacenta, listele vecinilor si vectorul muchiilor.
Matricea de adiacenta
Este o matrice patratica cu n linii si n coloane, in care elementele a[i,j] se definesc astfel: a[i,j]=1 daca exista (i,j) in U, cu x diferit de y si 0 daca nu exista (i,j) in U.
Pentru graful G=(X,U) din figura de mai jos, matricea de adiacenta este:
linia
0 1 1 1 1
1 0 1 0 2
A= 1 1 0 1 3
1 0 1 0 4
coloana 1 2 3 4
a[i,j]=a[j,i] oricare ar fi i,j I
Proprietatile matricei de adiacenta:
Este o matrice simetrica;
Pe diagonala principala are toate elemntele egale cu 0;
Suma elementelor pe linia sau coloana i este egala cu gradul nodului i;
Daca elementele pe linia/coloana i sunt toate egale cu 0 atunci nodul este izolat;
Daca toate elementele din matrice,mai putin cele de pe diagonala principala, sunt 1 inseamna ca graful este complet.
Listele vecinilor
Pentru fiecare nod al grafului se retin nodurile adiacente cu el.
Pentru reprezentarea listei de adiacenta se poate folosi alocare dinamica.
Exemplu pentru matricea de adiacenta de mai sus:
nodul lista vecinilor
3, 4
3
2, 4
3
Vectorul muchiilor
Fiecare muchie a grafului poate fi privita ca o inregistrare cu doua componente: cele doua varfuri care constitue extremitatile muchiei. Notand aceste extremitati cu nod1 si nod2, putem defini tipul de date tmuchie, astfel:
type tmuchie=record
nod1,nod2:integer;
end;
Graful in ansamblul sau, este o multime de muchii, adica o multime de elemente de tipul tmuchie.In consecinta definim graful ca un "vector de muchii", adica un vector cu elementele de tipul tmuchie:
var v:array[1..25] of tmuchie;
Graf complet si graf bipartit.
Se numeste graf complet cu n varfuri, notat Kn, un graf G=(X,U) cu proprietatea ca intre oricare doua varfuri exista o muchie.
Exemplu:
Un graf complet cu n varfuri are n*(n-1)/2 muchii.
Un graf neorientat G=(X,U) se numeste bipartit daca exista 2 multimi de noduri A si B X astfel incat A B=X si A B= ; iar orice muchie din U are o extremitate in multimea A si una in multimea B.
Exemplu:
Fie G=(X,U) unde X=, U=
Cu multimile A= si B=
Se obesrva ca: A B=X, A B= , iar
fiecare muchie are o extremitate in A si una in B.
Se numeste graf
bibartit complet, un graf bipartit cu proprietatea ca pentru orice varf
x din A si orice varf y din B, exista muchia(x,y) (unde A si B sunt cele doua
submultimi care partitioneaza multimea varfurilorX).
Exemplu:
Notiunile de lant si ciclu
Se numeste lant in graful G, o succesiune de varfuri L=(x1,x2,...,xp) ,cu xi IX, in care ( ) 2 noduri consecutive din succesiune sunt adiacente, adica exista muchiile (x1,x2),(x2,x3),..,(xp-1,xp)IU.
Varfurile x1 si xp se numesc extremitatile lantului, iar numarul de muchii care intra in componenta sa reprezinta lungimea lantului.
Un lant in care ( ) 2 elemente sunt diferite se numeste lant elementar. Altfel lantul este neelementar.
Exemplu:
Lant elementar:1,2,3,4,5; 6,7,3,9,4,8.
Lant neelementar: 1,2,3,2;
Un graf G este conex, daca oricare ar fi doua varfuri ale sale , exista un lant care le leaga.
Se numeste ciclu intr-un graf, un lant in care extremitatile coincid si muchiile sunt diferite intre ele.
Exemplu: c1=(3,4,5,3,7,6,1,2,3), c2=(1,2,3,7,6,1), c3=(3,5,4,9,3)
Daca intr-un ciclu, toate varfurile cu exceptia primului si a ultimului sunt distincte doua cate doua, atunci ciclul se numeste elementar. In caz contrar el este neelementar.
Ciclurile c2 si c3 din exemplul anterior sunt elementare,iar c1 este neelementar(in c1, varful 3 apare si ca varf "intermediar",adica traseul descris mai trece odata prin varful 3 pe langa faptul ca porneste din el si se intoarce tot in el.).
Grafuri hamiltoniene si euleriene.
Se numeste ciclu hamiltonian intr-un graf, un ciclu elementar care contine toate varfurile grafului.
Un graf care contine un ciclu hamiltonian se numeste graf hamiltonian.
Un lant elementar care contine toate varfurile grafului se numeste lant hamiltonian.
Un graf hamiltonian are cel putin trei varfuri.
Graful complet cu n varfuri este un graf hamiltonian.
Teorema:
Fie G=(X,U), cu n>=3 varfuri, daca oricare ar fi x un nod al grafului si d(x)>=n/2, atunci graful este hamiltonian.
Se numeste ciclu eulerian intr-un graf, un ciclu care contine toate muchiile grafului.
Un graf care contine un ciclu eulerian se numeste graf eulerian.
Un lant eulerian este un lant care contine toate muchiile grafului.
Teorema:
Un graf fara varfuri izolate este eulerian, daca si numai daca este conex si gradele tuturor varfurilor sunt numere pare.
Prin parcurgerea grafurilor neorientate se intelege vizitarea varfurilor intr-o anumita ordine, ordine data de un anumit criteriu.
Exista doua metode de parcurgere:
Parcurgerea in latime BF(Breadth First);
Parcurgerea in adancime DF(Depth First);
Algoritmul de parcurgere in latime BF
Fiind dat un graf neorientat G=(X,U) si un nod xIX, sa se parcurga toate varfurile grafului incepand din varful x.
Metoda consta in:
-se viziteaza varful de pornire, dupa care se viziteaza toate varfurile adiacente cu acesta care nu au fost vizitate inca,in continuare se alege primul varf adiacent cu varful de pornire si se viziteaza toate varfurile adiacente cu acesta nevizitate inca si asa mai departe pentru celelalte varfuri cat timp este posibil.Exemplu:
Presupunem ca varful de pornire este 1,atunci parcurgerea BF este:1,2,5,6,3,4,7.
Pentu 3 varf de pornire:3,2,4,1,5,6,7.
Pentru implementare vom folosi un vector care are proprietatile unei cozi, fie c=(c1,c2,.,ck). Capetele de intoducere si extragere vor fi identificate prin pozitiile p si respectiv u.
Notam cu n numarul de noduri din graf. Este necesar ca elemntele matricei de adiacenta a cu n linii*n coloane sa fie cunoscute.
Mai avem nevoie de un vector viz cu n elemente, in care elementele viz[k] (k=1,2,..,n) au semnificatia: viz[i]=0, daca varful i nu a fost vizitat sau viz[i]=0 daca a fost vizitat. Mai intai initializam tot vectorul viz cu 0.
Initial in coada se gaseste varful de pornire: p=1, u=1, c[p]:=x, viz[x]:=1.
Cat timp mai sunt elemente in coada("while p<=u"):
Extragem din coada varful aflat in capatul de extragere u, si-l memoram intr-o variabila z;
Pe linia z in a cautam vecinii lui z si ii introducem in coada.
Algoritmul de parcurgere in adancime DF
Metoda consta in:
-alegem varful de pornire, pentru acesta se alege primul vecin al sau nevizitat inca,pentru acest vecin cautam primul vecin al sau nevizitat si asa in continuare. In cazul in care un varf nu mai are vecini nevizitati atunci ne intoarcem la nodul anterior, iar pentru acel nod cautam urmatorul vecin nevizitat al sau.
Pentru graful de mai sus parcurgerea in adancime plecand de la varful 1 este: 1,2,3,4,6,7,5.
Pentru a implementa vom folosi o stiva si metoda backtracking.
Conexitatea in grafurile neorientate
Prin parcurgerea in latime acelui graf am subliniat o proprietate importanta a grafului:faptul ca in urma parcurgerii au fost vizitate toate varfurile.
Luand oricare doua varfuri,putem gasi cel putin un traseu care porneste dintr-un varf si ajunge in celalalt. Luand oricare doua varfuri, ele pot fi legate printr-un lant. Dar nu toate grafurile sunt conexe. In schimb putem desprinde din el "portiuni" care, fiecare luata separat, este un graf conex.
Exemplu:
Se numeste componenta conexa a grafului G=(X,U), un subgraf G1=(X1,U1) a lui G, conex, cu proprietatea ca nu exista nici un lant care sa lege un varf din X1 cu un varf din X-X1.
In explicarea modului de functionare a acestei metode de parcurgere se foloseste un sir de intregi, VIZITAT, de lungime n cu ajutorul caruia se marcheaza nodurile deja "vizitate" pentru a evita trecerea de mai multe ori prin acelasi nod.Cu alte cuvinte VIZITAT[j] = 1 daca nodul j a fost deja atins si VIZITAT[j] = 0 in caz contrar.Vom spune despre un nod i ca a fost explorat daca are toate nodurile adiacente vizitate.
Procedura recursiva care asigura parcurgerea unui graf in adancime incepand cu un anumit varf i:
Procedura Parcurgere_in_adancime(i)
pentru toate varfurile k adiacente cu varful i executa
daca varful k este neparcurs
atunci se parcurge varful k
apel parcurgere_in_adancime(k)
Iesirea din recursivitate se produce in momentul in care nu se mai gasesc varfuri neparcurse adiacente cu varfurile parcurse deja. Este posibil ca dupa un apel al procedurii incepand cu un anumit varf i sa ramana in graf varfuri neparcurse.In aceasta situatie apelul procedurii se repeta pentru un alt varf initial (dintre varfurile neparcurse) pana la parcurgerea tuturor nodurilor grafului. Programul apelant trebuie sa asigure parcurgerea varfului utilizat in apel.Conditiile interne care apar in problemele particulare de backtracking pot impune o parcurgere integrala sau numai partiala a grafului.Procedura backtracking(i) este pentru cazul parcurgerii integrale a unui graf in adancime:
Procedura Backtracking(i)
pentru toate varfurile k adiacente cu varful i executa
daca varful k este neparcurs si sunt indeplinite conditiile de continuare
atunci se parcurge varful k
se utilizeaza varful k in solutie
daca s-a ajuns la o solutie se afiseaza
apel Backtracking(k)
Folosind aceasta tehnica de traversare ne propunem sa raspundem la intrebarea:
Fiind dat un graf neorientat G=(V,E), este acesta un graf conex?
Conform acestei metode explorarea unui nod este suspendata ori de cate ori un nou varf este vizitat.Pentru graful G daca pornim din varful 1, vizitarea nodurilor se va face in ordinea: 1,2,4,8,5,6,3,7.
Urmatoarea functie returneaza true daca graful este conex si false in caz contrar folosind tehnica parcurgerii in adancime:
Function Conex: boolean;
Procedura adancime(s)
VIZITAT[s]:=1;
pentru fiecare nod w adiacent cu s executa
daca VIZITAT[w] = 0 atunci apel adancime(w)
sfarsit daca;
sfarsit pentru;
sfarsit procedura;
pentru toate nodurile w executa
VIZITAT[w]:=0;
sfarsit pentru;
apel adancime(1);
Conex:=true;
pentru toate nodurile w executa
daca VIZITAT[w] = 0 atunci
conex:=false;
sfarsit daca;
sfarsit pentru;
Sfarsit functie;
Sa se relizeze o aplicatie in limbajul Pascal care sa evidentieze grafic modul de parcurgere in latime si in adincime a unui graf neorienta. Datele de intrare ale programului sunt:
numarul de noduri ale grafului
numarul nodului de start in parcurgerea grafului
matricea de adiacenta a grafului
Aceste date sunt citite din fisierul PARC_GRF,TXT.
Variabile Globale
n - numarul de noduri ale grafului
nstart - numarul nodul de start in parcurgerea grafului
m - reprezinta matricea de adiacenta a grafului
nod - nodul curent
tata - numarul tattalui nodului curent
s[] - este un vector cu rol de stiva si stocheaza nr. Nodului curent
Functti si Proceduri
InitializareModGrafic() - efectueaza operatia d initializare a modului grafic.
ReadData() - citeste din fisierul PARC_GRF.TXT datele de intrare.
Parcurgere() - efectueaza o parcurgere a grafului cu scopul determinarii numarului de nivele si de initializare a vectorului s[}
Conect(q,w:byte) - testeaza daca varful q are o muchie comuna cu varful w si o deseneaza
GNod(q:byte) deseneaza nodul q
MarkNod(q:byte) - marcheaza nodul vizitat
pa() - efectueaza parcurgerea in adancime a grafului
pl() - efectueaza parcurgerea in latime a grafului
primapagina - implementeaza pagina de start a proiectului
meniu - implementeaza meniul aplicatiei. Meniul permite selectia tipului de parcurgere sau optiunea de iesire din program.
program Parcurgere_Arbore;
uses Crt,Graph;
type
matrice=array[1..16,1..16] of byte;
vector=array[1..16] of byte;
var
m,mtr :matrice;
s,v,p,d :vector;
ti,j,n,k :byte;
i:integer;
nivele,nstart, npen,pos :byte;
nod,tata, nr:byte;
as,ev :boolean;
opt,ch :char;
procedure InitializareModGrafic;
var driver,modg :integer;
begin
driver:=detect;
initgraph(driver,modg,'..bgi');
end;
procedure ReadData;
var
i,j :byte;
f :text;
begin
assign(f,'PARC_GRF.txt');
reset(f);
read(f,n);
read(f,nstart);
for i:=1 to n do
for j:=1 to n do
read(f,m[i,j]);
close(f);
end;
procedure Parcurgere;
var i,aux,k,k1 :byte;
b :boolean;
s :vector;
begin
for i:=1 to n do p[i]:=0;
k:=1; s[k]:=nstart;
k1:=1; d[k1]:=nstart;
p[s[k]]:=p[s[1]]+1;
repeat
for i:=1 to n do
begin
if m[s[1],i]=1 then
begin
inc(k); s[k]:=i;
m[s[1],i]:=0; m[i,s[1]]:=0;
inc(k1); d[k1]:=s[k];
p[s[k]]:=p[s[1]]+1;
end;
end;
for i:=1 to k-1 do
s[i]:=s[i+1];
dec(k);
until k=0;
repeat
b:=true;
for i:=1 to n-1 do
if p[i]>p[i+1] then
begin
aux:=p[i];
p[i]:=p[i+1];
p[i+1]:=aux;
b:=false;
end;
until b;
nivele:=0;
for i:=1 to n do
if p[i]>nivele then nivele:=p[i];
end;
procedure Conect(q,w:byte);
var kx,ky,kk :integer;
aux,i :byte;
x1,y1,x2,y2 :integer;
begin
npen:=0; pos:=0;
for i:=1 to n do
if d[i]=q then begin kk:=i; i:=n; end;
for i:=1 to n do
begin
if p[i]=p[kk] then inc(npen);
if (i<=kk)and(p[i]=p[kk]) then inc(pos);
end;
y1:=(350 div nivele)*p[kk];
x1:=285-((npen*70)div 2)+pos*70;
npen:=0; pos:=0;
for i:=1 to n do
if d[i]=w then begin kk:=i; i:=n; end;
for i:=1 to n do
begin
if p[i]=p[kk] then inc(npen);
if (i<=kk)and(p[i]=p[kk]) then inc(pos);
end;
y2:=(350 div nivele)*p[kk];
x2:=285-((npen*70)div 2)+pos*70;
setcolor(3); line(x1,y1,x2,y2);
end;
procedure GNod(q:byte);
var kx,ky,kk :integer;
i :byte;
s :string;
begin
npen:=0; pos:=0;
for i:=1 to n do
if d[i]=q then begin kk:=i; i:=n; end;
for i:=1 to n do
begin
if p[i]=p[kk] then inc(npen);
if (i<=kk)and(p[i]=p[kk]) then inc(pos);
end;
ky:=(350 div nivele)*p[kk];
kx:=285-((npen*70)div 2)+pos*70;
str(q,s);
setcolor(q mod 9+1);
setfillstyle(10,q mod 9+1); fillellipse(kx,ky,15,15);
setfillstyle(11,q mod 9+1); fillellipse(kx-2,ky-2,13,13);
setfillstyle(9,q mod 9+1); fillellipse(kx-2,ky-2,11,11);
setfillstyle(1,q mod 9+1); fillellipse(kx-2,ky-2,9,9);
setcolor(q mod 9+1); circle(kx,ky,15);
setcolor(7); circle(kx,ky,16);
settextstyle(1,0,0);
setusercharsize(1,2,1,2);
settextjustify(1,1);
setcolor(15);
outtextxy(kx,ky-3,s);
settextstyle(11,0,0);
end;
procedure MarkNod(q:byte);
var kx,ky,kk :integer;
i :byte;
s :string;
begin
npen:=0; pos:=0;
for i:=1 to n do
if d[i]=q then begin kk:=i; i:=n; end;
for i:=1 to n do
begin
if p[i]=p[kk] then inc(npen);
if (i<=kk)and(p[i]=p[kk]) then inc(pos);
end;
ky:=(350 div nivele)*p[kk];
kx:=285-((npen*70)div 2)+pos*70;
SetLineStyle(0,0,1);
Circle(kx,ky,20);
end;
procedure ParcLatime;
var i,aux,k,k1 :byte;
b :boolean;
v :vector;
st :string;
begin
k:=1; s[k]:=nstart; k1:=1;
MarkNod(s[k]);
Str(s[k],st);
Outtextxy(k1*40,457,st);
Delay(500);
repeat
for i:=1 to n do
begin
if m[s[1],i]=1 then
begin
inc(k); s[k]:=i; inc(k1);
m[s[1],i]:=0; m[i,s[1]]:=0;
MarkNod(s[k]);
Str(s[k],st);
Outtextxy(k1*40,457,st);
Delay(500);
end;
end;
for i:=1 to k-1 do
s[i]:=s[i+1];
dec(k);
until k=0;
end;
procedure ParcAdincime;
var i,aux,k,k1 :byte;
b :boolean;
v :vector;
st :string;
begin
k:=1; s[k]:=nstart; k1:=1;
MarkNod(s[k]);
Str(s[k],st);
Outtextxy(+k1*40,457,st);
Delay(500);
repeat
b:=true;
for i:=1 to n do
begin
if m[s[k],i]=1 then
begin
b:=false;
m[s[k],i]:=0; m[i,s[k]]:=0;
inc(k); s[k]:=i; inc(k1);
i:=n;
MarkNod(s[k]);
Str(s[k],st);
Outtextxy(k1*40,457,st);
Delay(500);
end;
end;
if b then dec(k);
until k=0;
end;
procedure pl;
begin
SetFillStyle(6,1);
Bar(0,0,639,479);
SetColor(11);
Rectangle(0+5,0+5,639-5,479-5);
ReadData; mtr:=m;
Parcurgere; m:=mtr;
for i:=1 to n do
for j:=1 to n do
if m[i,j]=1 then Conect(i,j);
for i:=1 to n do GNod(i);
SetTextStyle(7,0,2);
SetTextJustify(0,1);
OutTextXY(10,430,'Parcurgere in latime: ');
ParcLatime;
ReadKey;
ClearDevice;
SetColor(15);
Rectangle(0,0,639,479);
end;
procedure pa;
begin
SetFillStyle(6,1);
Bar(0,0,639,479);
SetColor(11);
Rectangle(0+5,0+5,639-5,479-5);
ReadData; mtr:=m;
Parcurgere; m:=mtr;
for i:=1 to n do
for j:=1 to n do
if m[i,j]=1 then Conect(i,j);
for i:=1 to n do GNod(i);
SetTextStyle(7,0,2);
SetTextJustify(0,1);
OutTextXY(10,430,'Parcurgere in adincime: ');
ParcAdincime;
ReadKey;
ClearDevice;
SetColor(15);
Rectangle(0,0,639,479);
end;
procedure primapagina;
begin
cleardevice;
Rectangle(0,0,636,476);
Rectangle(3,3,639,479);
setcolor(14);
settextstyle(1,0,2);
outtextxy(90,20,' Liceul de Informatica - Slatina');
settextstyle(10,0,3);
setcolor(9);
for i:=0 to 2 do begin
outtextxy(135+i,100+i,'PROIECT DE ATESTAT');
outtextxy(100+i,140+i,'= parcurgerea grafurilor =');
delay(100);
end;
settextstyle(3,0,3);
for i:=0 to 194 do begin
setcolor(12);
outtextxy(i-100,360,'Indrumator :');
outtextxy(640-i,360,'Executant :');
setcolor(0);
outtextxy(i-100,360,'Indrumator :');
outtextxy(640-i,360,'Executant :');
i:=i+2;
end;
setcolor(12);
outtextxy(80,360,'Indrumator :');
outtextxy(430,360,'Executant :');
setcolor(15);
Rectangle(0,0,636,476);
Rectangle(3,3,639,479);
for i:=292 DOWNto 80 do begin
setcolor(12);
outtextxy(i,400,'OPRISAN OLTITA');
outtextxy(530-i,400,'MUSTATA CRISTIAN');
setcolor(0);
outtextxy(i,400,'OPRISAN OLTITA');
outtextxy(530-i,400,'MUSTATA CRISTIAN');
i:=i-2;
end;
setcolor(12);
outtextxy(80,400,'OPRISAN OLTITA');
outtextxy(430,400,'MUSTATA CRISTIAN');
settextstyle(0,0,0);
setcolor(14);
outtextxy(300,460,'2005');
setcolor(15);
Rectangle(0,0,636,476);
Rectangle(3,3,639,479);
readkey;
cleardevice;
end;
procedure desenmenu(o:integer);
begin
setcolor(0);
Rectangle(178,128,462,162);
Rectangle(178,178,462,212);
Rectangle(178,228,462,262);
settextstyle(1,0,2);
settextjustify(0,2);
case o of
1:begin setcolor(12);Rectangle(178,128,462,162);end;
2:begin setcolor(12);Rectangle(178,178,462,212);end;
3:begin setcolor(12);Rectangle(178,228,462,262);end;
end;
end;
procedure meniu;
begin
SetFillStyle(6,1);
Bar(0,0,639,479);
SetColor(11);
Rectangle(0+5,0+5,639-5,479-5);
setcolor(9);
settextstyle(10,0,3);
settextjustify(0,2);
outtextxy(260,60,'Meniu');
setcolor(15);
Rectangle(180,130,460,160);
Rectangle(180,180,460,210);
Rectangle(180,230,460,260);
settextstyle(1,0,2);
settextjustify(0,2);
outtextxy(185,130,' Parcurgere in adincime');
outtextxy(185,180,' Parcurgere in latime');
outtextxy(185,230,' Exit');
setcolor(0);
Rectangle(178,128,462,162);
Rectangle(178,178,462,212);
Rectangle(178,228,462,262);
nr:=1;
desenmenu(1);
repeat
opt:=readkey;
case opt of
#80:
begin
if (nr=3) then nr:=1 else nr:=nr+1;
desenmenu(nr);
end;
#72:
begin
if (nr=1) then nr:=3 else nr:=nr-1;
desenmenu(nr);
end;
#13:
begin
case nr of
1:begin cleardevice;pa;end;
2:begin cleardevice;pl;end;
3:begin closegraph;halt(1);end;
end;
SetFillStyle(6,1);
Bar(0,0,639,479);
SetColor(11);
Rectangle(0+5,0+5,639-5,479-5);
setcolor(9);
settextstyle(10,0,3);
settextjustify(0,2);
outtextxy(260,60,'Meniu');
setcolor(15);
Rectangle(180,130,460,160);
Rectangle(180,180,460,210);
Rectangle(180,230,460,260);
settextstyle(1,0,2);
settextjustify(0,2);
outtextxy(185,130,' Parcurgere in adincime');
outtextxy(185,180,' Parcurgere in latime');
outtextxy(185,230,' Exit');
setcolor(0);
Rectangle(178,128,462,162);
Rectangle(178,178,462,212);
Rectangle(178,228,462,262);
desenmenu(nr);
end;
end;
until (opt=#27)
end;
Begin
ClrScr;
InitializareModGrafic;
primapagina;delay(500);
SetColor(15);
Rectangle(0,0,639,479);
meniu;
CloseGraph;
End.
1. V.Cristea, E.Kalisz, I.Atanasiu, V.Iorga. Tehnici de programare. Ed.Teora, Bucuresti, 1995.
2. V.Dadarlat, I.Ignat, M.Topan, L.Petrescu. Programarea calculatoarelor. Structuri de date si algoritmi. Litografia U.T.C.N., 1995.
I.Ignat, V,Dadarlat, M.Topan, L.Petrescu.. Turbo Pascal 7.0.
Fundamente si aplicatii. Ed.Albastra, Cluj-Napoca, 1996.
4. I.Ignat, V.Dadarlat, I.Rus, A.Kacso. Programarea sistematica in Turbo Pascal 6.0. Ed. Cartii de Stiinta, Cluj-Napoca, 1992.
5. L.Livovschi, H.Georgescu. Analiza si sinteza algoritmilor. Ed. Enciclopedica, Bucuresti, 1986.
6. L.Negrescu. Limbajele C si C++ pentru incepatori, Vol. 1 si 2. Ed. Microinformatica, Cluj_Napoca, 1994 (reeditare 2000).
7. L.D.Serbanati, V.Cristea, F.Moldoveanu, V.Iorga. Programarea sistematica in limbajele Pascal si Fortran. Ed.Tehnica, Bucuresti, 1984.
8. N.Wirth. Algorithms + Data Structures = Programs.Prentice Hall, 1978.
9. Iosif Ignat Programarea calculatoarelor - Indrumator de lucrari de laborator Editura UT Press 2001
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 1389
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved