Sunteți pe pagina 1din 74

I.

Tipuri de date simple şi structurate (enumerare, caracteristici, exemple în limbaje


procedurale)

In limbajele prodcedurale, exista mai multe tipuri de date simple si structurate pe care le putem
utiliza.

 Tipuri de date simple:


1. Integer(intreg): Reprezinta numere intregi, de exemplu: 1, 2, 100.
2. Float(zecimal): Reprezinta numere cu zecimale, de exemplu: 3.14, 124.231, etc.
3. Char(caracter): Reprezinta un singur caracter, de exemplu: a, g, X.
4. Boolean(logic): Reprezinta valori de adevar, care pot fi doar true(adevarat) sau
false(fals).

Exemple:

Int age = 25;


Float weight = 23.4;
Char grade = „A”;
Bool DaiLicenta = False;
 Tipuri de date structurare:
1. Array(tablou): Permite stocarea unui set de valori de acelasi tip accesibele prin
index. De exemplu, un tablou de numere intregi:

Exemplu:

Int NotaLicenta[5] ={0,1, 2, 3, 4};

2. Struct(structura): Permite gruparea mai multor tipuri de date intr-o singura


entitate. De exemplu, o structura pentru a reprezenta o persoana cu nume si nota
de licenta:

Exemplu:
Struct Student{
Char name[50];
Int note;
};
Struct Student PrimulPicat:
PrimulPicat.name = „Anatoli Ciucas”:
PrimulPicat.note = 1;
3. Enum(enumerare): Permite definirea unui set de constante cu nume. De exemplu,
o enumerare pentru zilele de licenta:

Enum ZileGrele{
Luni,
Marti,
Miercuri,
Joi,
Vineri,
};
Enum ZileGrele = Luni;
II. Structura de tablou -?
Structura de tablou este un tip de date structurat care permite stocarea unui numar fix de
elemente de acelasi tip, accesibile prin index. Fiecare element din tablou are o pozitie numerica
unica, incepand de la 0 si pana la dimensiunea tabloului -1.

Caracteristici ale structurii de tablou:

 Dimensiunea tabloului trebuie specificat la momentul declararii.


 Elementele tabloului trebuie sa fie de acelasi tip de date.
 Accesarea elementelor se face prin intermediul indexului.
 Indexul poate fi o valoare numerica constanta sau variabila.
 Valoarea tabloului pot fi modificate si accedate individual sau prin intermediul buclelor.
Exemplue
Int Nota[5];
Nota[1] = 6;
Nota[2] = 4;
Nota[3] = 3;
Nota[4] = 15;
Nota[5] = 2;
Structurile de tablouri sunt utile pentru gestionarea si manipularea unor seturi de date omogene,
precum lista de note ale unui student, valorile unui vector in spatiul tridimensional sau
elementele unei imagini.

III. Liste (stive, cozi, algoritmi de manevră)


Listele, cum ar fi stivele si cozile sunt structuri de date dinamice utilizate in programare pentru a
stoca si organiza date intr-o anumita ordine. Acesta ofera operatii specifice pentru inserarea,
stergerea si accesarea a elemetelor in functie de regula de ordine.

1. Stive:

Caracteristici:

 Functioneaza pe principiul LIFO (Last-In, First-Out) – ultimul element


introdus este primul care este eliminat.

Operatia principala:

 Push: Adauga un element la varful stivei.


 Pop: Elimina si returneaza elementul de la varful stivei.
 Peek: Returneaza elemetul de la varful stivei fara a-l elimina.

Exemple de utilizare:

 Evaluarea expresiilor matematice in forma postfixata(Reverse Polish


Notation).
 Gestionarea apelurilor de functii in stiva de apel(Call Stack).
2. Cozi:
Caracteristici:
 Functioneaza pe principiul FIFO(First-In, First-Out) – primul element
introdus este primul care este eliminat.

Operatii principale:

 Enqueue: Adauga un element la sfarsitul cozii.


 Dequeue: Elimina si returneaza elementul de la inceputul cozii.
 Front: Retuneaza elementul de la inceputul cozii fara a-l elimina.

Exemple de utilizare:

 Procese task-urilor intr-un planificator(sheduler).


 Implementarea unui buffer de mesaje in comunicatii.
3. Algoritmi de manevrarea a listelor:
 Inserarea la inceput: Adauga un element la inceputul listei.
 Inserarea la sfarsit: Adauga un element la sfarsitul listei.
 Inserarea in interior: Adauga un element intr-o pozitie specifica in lista.
 Stergerea de la inceput: Elimina elementul de la inceputul listei.
 Stergerea de la sfarsit: Elimina elementul de la sfarsitul listei.
 Stergerea din interior: Elimina un element dontr-o pozitie specifica in lista.
 Cautare: Gaseste un elemet in lista in functie de o anumita valoare.

Acestea sunt doar cateva exemple de structuri de liste si algoritmi de manevra. Exista si alte
tipuri de lista si algoritmi asociate acestora, cum ar fi liste dublu inlantuite, liste circulare si
diverse implementari si optimizari ale acestora in diferite limbaje de programare.

IV. Liste (simplu înlănţuite, dublu înlănţuite, algoritmi de manevră)


Listele sunt structuri de datein informaticacare permite stocarea si gestionarea unei colectii de
elemente intr-o ordine specifica.

1. Liste simplu inlantuite:

 O lista simplu inlantuita este formata dintr-o serie de noduri, fiecare nod
continand un element si o referinta catre urmatorul nod din lista.
 Primul nod din lista se numeste capul listei, iar ultimul nod contine o referinta
null.
 Algoritmii de manevra obisnuiti pentru liste simplu inlantuite includ:
o Inserarea: Elementele noi pot fi inserate la inceputul listei (creand un
nou nod si actualizand referinta capului) sau in mijlocul listei
(actualizarea referintele nodurilor vecine).
o Stergerea: Elementele pot fi eliminate din lista prin actualizarea
referintelor nodurilor vecine pentru a evita nodul care urmeaza sa fie
sters.
o Cautare: Pentru a gasi un anumit element in lista, se poate parcurge
liste secvential, incepand de la capul listei si continuand pana la
gasirea elementului sau pana la sfarsitul listei.
2. Liste dublu inlantuite:
 O lista dublu inlantuita are aceeasi structura ca si lista simpla inantuita, cu
exceptia faptului ca fiecare nod contine acum o referinta catre nodul anterior,
ianfara de referinta catre nodul urmator.
 Aceasta structura permite parcurgerea in ambele directii a listei, inbunatatind
eficienta in anumite operatii.
 Algoritmul de manevra pentru liste dublu inlantuite sunt similari cu cei pentru
liste simplu inlantuite, dar necesita actualizari suplimentare ale referintelor
catre nodurile vecine in timpul inserari si stergeri

V. Parcurgerea grafurilor în adâncime şi în lăţime

Parcurgerea grafurilor de adancime (DFS – Depth-First Search) si in latime (BFS –


Breadth – First Search) sunt doua tehnici fundamentale utilizate in algoritmica
grafurilor pentru a explora si parcurge toate nodurile unui graf.

1. Parcurgerea in adancime (DFS):


 DFS exploreaza un graf prin urmatoarea strategie: se selecteaza un nod de
start si se exploreaza cat mai adanc posibil pe fiecare ramura inainte de
areveni inapoi si a explora celelalte ramuri.
 In implementarea, DFS poate fi realizat folosind o reprezentare a grafului,
cum ar fi liste de adiancenta sau matrice de adiacenta, si poate fi recursiva sau
iterativa.
 In timpul parcurgerii DFS, se marcheaza fiecare nod vizitat pentru a evita
cicluri infinite si pentru a asigura ca fiecare nod este vizitat o singura data.
 Parcurgerea DFS este adesea utilizata pentru a cauta cai, verificarea
conexiunii intre doua noduri si pentru a rezolva probleme care implica
explorarea profuna a grafului.

2. Parcurgerea in latime (BFS):


 BFS exploreaza un graf prin urmatoarea strategie: se selecteaza un nod de
start si se exploreaza toti vecinii sai inainte de a trece la urmatoarea generatie
de vecini.
 BFS utilizeaza o coada pentru a memora nodurile descoperite, astfel incat
nodurile sunt explorate in ordinea in care au fost descoperite.
 Similar ci DFS, in timpul parcurgeri BFS, fiecare nod vizitat este marcat
pentru a evita ciclurile si a asigura vizitarea fiecarui nod o singura data.
 Parcurgerea BFS este frecvent utilizata pentru a gasi cea mai scurta cale intre
doua noduri, pentru a determina daca un graf este bipartit si pentru a rezolva
alte probleme care necesita explorarea in latime a grafului.
Ambele metode, DFS si BFS, sunt importante in algoritmica grafurilor si pot fi aplicate intr-o
varietate de probleme si aplicatii, inclusiv cautarea in adancime si in latime, sortarea topologica,
gasirea ciclurilor intr-un graf si multe altele.

VI. Parcurgerea arborilor binari (inordine, preordine, postordine)


Parcurgerea arborilor binari se refera la vizitarea nodurilor unui arbore binar intr-un anumit
ordine specifica. Exista trei moduri principale de parcurgere a arborilor binari: parcurgere in
preordine, parcurgere in inordine si parcurgere in postordine.

1. Parcurgerea in preordine(RSD): In parcurgerea in preordine, nodurile sunt vizitate


in urmatoarea ordine: radacina, subarborele stang, subarborele drept. Astfel, se
urmeaza urmatorii pasi:
 Vizitam nodul radacina.
 Parcurgem in preordine subarborele stang.
 Parcurgem in preordine subarborele drept.
2. Parcurgere in inordine(SRD): In parcurgerea in inordine, nodurile sunt vizitate in
urmatoarea ordine: Subarborele stang, radacina, subarborele drept. Pasii sunt
urmatorii:
 Parcurgerea in inordine subarborele stang.
 Vizitam nodul principal.
 Parcurgem in iordine subarborele drept.
3. Parcurgem in postordine(SDR): In parcurgerea in postordine, nodurile sunt vizitate
in urmatoarea ordine: Subarbore stang, subarbore drept, radacina. Pasii sunt
urmatorii:
 Parcurgerea in inordine subarborele stang.
 Parcurgem in iordine subarborele drept.
 Vizitam nodul principal.

Fiecare dintre aceste metode de parcurgere are aplicatiile sale si poate fi utilizata in diferite
scenarii, in functie de necesitate. De exemplu, parcurgerea in preordine este utila pentru a
construi o expresie poloneza inversa sau pentru a realiza o copie a arborelui. Parcurgerea in
inordine este folosita pentru a sorta elementele unui arbore binar de cautare. Parcurgerea
postordinara este adesea utilizata pentru a elibera memoria alocata nodurilor arborelui.

 Inordine – SRD: 4 7 2 1 5 3 6
 Preordine: RSD 1 2 4 7 3 5 6
 Postordine: SDR 7 4 2 5 6 3 1

VII. Problema căutării. Căutare secvenţială, căutare binară


Problema cautari se refera la gasirea unei anumite valori(sau a unui element) intr-o structura de
date, cum ar fi un vector sau o lista. Exista doua metode de baza utilizate pentru cautare:
secventiala si binara.

1. Cautare secventiala:
Cautarea secventiala, cunoscuta si sub numele de cautare liniara, implica
parcurgerea elementelor in ordine si verificarea fiecarui element pana cand se
gaseste valoarea dorita sau se parcurge intreaga structura de date. Pasii pentru
cautarea secventiala sunt:
 Se incepe cautarea de la primul element al structurii de date.
 Se compara fiecare element cu valoarea cautata.
 Daca se gaseste valoarea cautata, cautarease incheie si se returneaza
pozitia sau informatia asociata elementului.
 Daca se parcurge intreaga structura de date si nu se gaseste valoarea
cauta , se poate returna un rezultat special pentru a indica ca valoarea nu
exista.

Cautarea secventiala este simpla si poate fi utilizata pentru orice structura de date, dar eficienta
sa scade pe masura ce dimensiunea structurii de date creste, deoarece trebuie sa parcurga
fiecare element.

2. Cautarea bianara:

Cautarea binara este o tehnica eficienta pentru catarea intr-o structura de date sortata, cum ar
fi un vector sau o lista ordonata. Acesta implica divizarea repetata a intervalului. Pasii pentru
cautarea binara sunt:

 Se incepe cautarea in intervalul complet al structuri de date sortate.


 Se compara valoarea cautata cu mijlocul intervalului.
 Daca valoarea cautata este egala cu mijlocul intervalului, cautarea se
incheie si se returneaza pozitia sau informatia asociata elementului.
 Daca valoarea cautata este mai mica de cat mijlocul intervalului, cautarea
continua in prima jumatate a intervalului.
 Daca valoarea cautata este mai mare de cat mijlocul intervalului, cautarea
continua in a doua jumatate a intervalului.
 Procesul se repeta prin impartirea intervalului in jumatati pana cand se
gaseste valoarea cautata sau intervalul devine gol.

Cautarea binara are o eficienta mai mare decat cautarea secventiala pentru structuri de date
sortate, deoarece exclude jumatate din elemente in fiecare pas. Totusi, cautarea binara necesita
ca structura de date sa fie sortata in prealabil.

VIII. Structuri fundamentale şi derivate în programarea procedurală


In programarea procedurala, structurile fundamentale sunt conceptate de baza pe care se
construieste logica programelor. Acestea includ:

1. Instructiuni secventiale: Acestea reprezinta o serie de instructiuni care


sunt executate in ordine, una dupa alta. Programul urmeaza un flux liniar
de executie, unde fiecare instructiune este executata inainte ca urmatoarea
sa fie accesata.
2. Instructiuni de control: Acesta permit programului sa ia decizii si sa
efectueze actiuni diferite, in functie de anumite conditii. Cele mai comune
instructiuni de control sunt:
 Instructiuni conditionale: Acesta verifica o anumita conditie si
executa anumite actiuni in functie de rezuktatul verificarii.
Exemple de astfel de instructiuni sunt „IF” (daca) si „SWITCH”
(comutatorul).
 Instructiuni de bucla: Acestea permite executarea repetata a unui
bloc de instructiune pana cand o anumita conditie devine falsa.
Exemple de astfel de instructiuni sunt „FOR”, „WHILE”, „DO-
WHILE”.
3. Functii: Acestea reprezinta sectiuni de cod care indeplineste o anumita
sarcina sau efectueaza o anumita operatie. Functiile permit structurarea si
modularizarea programelor, astfel incat sa poata fi reutilizate in diferite
contexte. Functiile pot avea parametri de intrare si pot returna rezultate.

Pe langa aceste structuri fundamentale, programarea procedurala permite si crearea de structura


derivata, care sunt construite pe baza acestor structuri fundamentale. Exemple de structuri
derivate includ:

1. Structuri de date: Acestea permite organizarea si stocarea eficienta a datelor intr-un


program. Exemplu de structuri de date in programarea procedurala includ tablouri
(arrays), liste (lists), stive (stacks) si cozi (queues). Aceste structuri de date
faciiteaza manipularea si gestionarea datelor in cadrul programelor.
2. Structuri de control anvansate: In afara de instructiunile de control de baza,
programarea procedurala permite utilizarea unor structuri de control mai avansate.
Acestea includ instructiuni de control conditionala in mai multe nivele („IF-ELSE
IF-ELSE”) si bucle incluse („NESTED LOOPS”) care permit logica complexa si
executia repetata in mai multe niveluri.
3. Biblioteci si module: Acestea sunt colectii de functii si cod predefinite, care sunt
scrise si puse la dispozitie de alti programatori. Utilizarea bibliotecilor si modulelor
permite programatorilor sa acceseze functionalitati si resurse suplimentare, fara a fi
nevoie sa rescrie intregul cod de la zero. Acestea adauga o dimensiune suplimentara
de reutilizare si eficienta in dezvoltarea programelor.

IX. Subprograme (definire, tipuri de transfer al parametrilor, apelare, variabile locale şi


globale)
Subprograme reprezinta sectiuni de cod reutilizabile si modularizare, care indeplinesc o
anumita sarcina sau efectuiaza o anumita operatie. Acesta permite structurarea si organizarea
programelor in bucati mai mici si mai usor de gestiont. In programarea procedurala,
subprogramele pot fi definite, apelate si pot interactiona cu alte parti ale programului folosind
parametri si variabile locale si globale.

1. Definirea subprogramului: Un subprogram este definit prin specificarea unui nume,


tipul de date al valorii returnate (daca exista) si lista de parametri (daca exista). Corpul
subprogramului contine intructiunile care trebuie executate atunci cand subprogramul
este apelat.
2. Tipuri de transfer al parametrului: Exista doua tipuri principale de transfer al
parametrilor catre subprograme.
 Transferul prin valoare: Valorile parametrilor sunt copiate si transmise catre
subprogram. Modificarile facute in interiorul subprogramului asupra valorilor
parametrilor nu afecteaza valorile originale din apelul subprogramului.
 Trasferul prin referinta: In acest caz adresele de memorie ale parametrilor sunt
transmise catre subprogram. Astfel subprogramul poate accesa si modifica direct
valorile parametrilor in memoria principala. Orice modificare facuta in interiorul
supprogramului va afecta valorile originale din apelul subprogramului.
3. Apelarea subprogramelor: Pentru a apela un subprogram, se utilizeaza numele acestuia
si se transmit argumentele corespunzatoare pentru parametrii definiri in apel. Apelul
subprogramului poate avea loc intr-o instructiune separata sau intr-o expresie, in functie
de specificul limbajului de programare utilizat.
4. Variabile locale: Subprogramele pot avea propriile lor variabile locale, care sunt definite
in interiorul subprogramului si sunt valabile doar in cadrul acestuia. Variabilele locale
sunt vizibile si pot fi utilizate numai in interiorul subprogramului respectiv si nu pot fi
accesate din alte parti ale programului.
5. Variabele globale: Variabele globale sunt definite in afara subprogramelor, adica in
partea pricipala a programului. Acestea sunt vizibile si accesibile in toate subprogramele
si in cadrul programului principal. Modificarile facute in variabilele globale intr-un
subprogram vor afecta valoarea acestora in intregul program.
Este important sa mentionam ca utilizarea adecvata a parametrilor si variabilelor locale si globale
poate asigura o gestionare eficienta a datelor si o comunicare corecta intre diferitele parti ale
progremului.
X. Recursivitate

Recursivitatea reprezinta o tehnica in programare in care un subprogram se apeleaza pe sine


pentru a rezolva o problema sau pentru a efectua o operatie. Acesta implica inpartirea unei
probleme complexe in subprobleme mai mici si rezolvarea lor recursiv pana cand se ajunge la o
situatie de baza in care problema este rezolvata direct.
Iata cateva aspecte importante despre recursivitate:

1. Functia/ recursia recursiva: O functie recursiva este o functie care se apeleaza pe sine
in cadrul propriului cod. Adesea, in functia recursiva, se verifica o conditie care
determina daca recursia continua sau se opreste si se rezolva problema intr-un mod direct.
2. Cazul de baza: Este un caz special in care recursia se opreste si se returneaza o valoare
rezultat. Cazul de baza este esential pentru a evita apelurile infinite si pentru a asigura
terminarea recursiei. Este importanta ca recursia sa progreseze catre cazul de baza in
fiecare apel recursiv.
3. Subprobleme mai mici: O problema complexa este inpartita in subprobleme mai mici,
care sunt rezolvate recursiv. Aceste subprobleme sunt de obicei o versiune mai mica sau o
abordare simplificata a problemei intiale. Rezolvarea recursiva a subproblemelor aduce la
rezolvarea problemei initiale.
4. Stiva de apel: Deoarece fiecare apel recursiv adauga o noua instanta a functiei pe stiva
de apel, trebuie sa fim atenti la utilizarea memoriei si sa evitam recursiile adanci. In cazul
recursivitatii profunde, s-ar putea sa apara o eroare de depasire a stivei.

Recursivitatea poate fi o tehnica puternica si eleganta pentru rezolvarea unor probleme


complexe, precum algoritmi si manipularea structurilor de date arbore (de exemplu arbore
binar),generarea de secventa sau permuatari, sau rezolvarea problemelor matematice, precum
calculul factorial sau Fibonacci.

Cu toate acestea, trebuie utilizata cu atentie, deoarece o recursie ineficienta sau incorect
implementat poate duce la performante slabe sau la bucle infinite. In unele cazuri, o abordare
iterativa(cu bucle) poate fi mai eficienta si mai usor de implementat decat recursivitatea.

XI. Noţiunile de bază ale programării obiectuale: clasă, metodă


Noriunile de baza ale progarmarii orientate pe obiecte includ clasele si metodele. Acestea sunt
concepte fundamentale in programarea obiectuala si ofera structura si organizare in dezvoltarea
aplicatiilor.

 Clasa:

O clasa ete un sablon sau o definitie care descrie caracteristicile si comportamentul unui obiect.
Este un concept abstract care serveste drept baza pentru crearea de obiecte. O clasa poate fi
considerata ca o macheta sau un tip de date personalizat. Ea defineste proprietatile (variabile) si
comportamentul (metode) unui obiect. De exemplu, putem avea o clasa numita „Masina” care
descrie proprietati cum ar culoarea, marca si model, si comportamente cum ar fi pornirea si
oprirea masinii.

Exemplu:

 Metoda:

O metoda este un bloc de cod care defineste comportamentul unui obiect sau actiunile pe care le
poate realiza. Metodele sunt asociate cu o clasa si sunt utilizate pe care le poate realiza. Metodele
sunt asociate cu o clasa si sunt utilizate pentru a efectua operatii sau pentru a accesa si manipula
datele unui obiect. Ele reprezinta actiunile pe care o poate oferi. De exemplu, in clasa „Masina”,
putem avea metode precum „pornire()” si „oprire()” pentru a efectua actiuni specifice asupra
masinii.
Metode abstracte: este o metoda fara implementare care reprezinta o operatie generala.

Metode de acces: este un tip de metoda, de obicei foarte simplu si consta din cateva linii
de cod, care permite accesul la un atribut al obiectului.

Metoda de extindere: este un tip de metoda care, odata afirmata, este adaugata automat
la o clasa sau la un tip dupa finalizarea acestuia.

In programarea orientat pe obiecte, obiectele sunt create din clase si sunt instantiate pentru a fi
utilizate in aplicatii. O clasa defineste structura si comportamentul unui obiect, iar metodele din
clase ofera modul de interactiune si manipulare a datelor in cadrul obiectului respectiv. Astfel,
programarea obiectuala faciliteaza modularitatea, reutilizeaza si organizarea codului, ceea ce
duce la dezvoltarea mai eficienta a aplicatiilor.

XII. Proprietăţile claselor şi ale metodelor


Proprietatile claselor si ale metodelor sunt concepte cheie in programarea orinetata pe obiecte.
Acestea nu permite sa definim comportamentul si starea obiectelor intr-un mod structurat si
modular.

Proprietatile claselor reprezinta caracteristicele sau atributele asociate unuei clase. Acestea
defineste starea interna a obiectelor create din clasa si pot fi reprezentate de variabilele de
instanta. Proprietatile clasei defineste datele pe care obiectele le pot stoca si manipula. Ele pot fi
variabile de tip primitiv (de exemplu numere intregi, numere reale sau siruri de caractere) sau pot
fi obiective in sine.

De exemplu, să luăm în considerare o clasă "Cerc" care are o proprietate "raza". Raza poate fi
definită ca o variabilă de instanță a clasei Cerc și poate fi utilizată pentru a stoca valoarea razei
unui cerc specific.
În acest exemplu, proprietatea clasei "raza" este definită în constructorul clasei "init". Apoi,
putem crea o instanță a clasei "Cerc" numită "cerc1" și putem accesa valoarea proprietății "raza"
utilizând sintaxa "cerc1.raza".

Metodele, pe de altă parte, sunt funcții definite în interiorul claselor și sunt utilizate pentru a
defini comportamentul obiectelor clasei respective. Acestea pot accesa și manipula proprietățile
clasei și pot oferi diverse funcționalități.

Continuând exemplul cu clasa "Cerc", să adăugăm o metodă numită "calcul_area" care


calculează aria cercului
pe baza razei sale:

class Cerc:
def __init__(self, raza):
self.raza = raza

cerc1 = Cerc(5)
print(cerc1.raza) # Output: 5
În acest exemplu, am adăugat metoda "calcul_area" în clasa "Cerc". Aceasta primește un singur
argument "self", care reprezintă instanța curentă a clasei. Metoda utilizează proprietatea clasei
"raza" pentru a calcula aria cercului și returnează rezultatul.

În concluzie, proprietățile claselor sunt utilizate pentru a stoca datele asociate obiectelor, în timp
ce metodele sunt utilizate pentru a defini comportamentul obiectelor și pentru a efectua operații
pe aceste date.
Aceste
concepte sunt class Cerc:
fundamentale def __init__(self, raza): în
self.raza = raza
programarea
orientată pe def calcul_area(self):
obiecte și return 3.14 * self.raza ** 2
permit crearea de
cerc1 = Cerc(5)
structuri de
print(cerc1.calcul_area()) # Output: 78.5
cod
reutilizabile,
eficiente și organizate.

XIII. Structuri de control în programarea vizuală


În programarea vizuală, structurile de control sunt utilizate pentru a controla fluxul de execuție al
programului, în funcție de anumite condiții sau evenimente. Aceste structuri permit
programatorilor vizuali să controleze execuția programului fără a fi nevoie să scrie cod într-un
limbaj de programare tradițional. În loc de asta, ei pot utiliza blocuri vizuale sau elemente grafice
pentru a configura structurile de control.

Iată câteva exemple comune de structuri de control utilizate în programarea vizuală:

1. Structura condițională (if/else): Această structură permite executarea unei anumite


acțiuni în funcție de îndeplinirea unei condiții. În programarea vizuală, aceasta poate fi
reprezentată de blocuri vizuale care permit trasearea unui flux de execuție într-o direcție
sau alta în funcție de rezultatul evaluării condiției.
2. Bucle (for/while): Buclele permit executarea repetată a unui bloc de cod până când
anumite condiții sunt îndeplinite. În programarea vizuală, acestea pot fi reprezentate prin
blocuri vizuale care permit definirea unei iterații sau repetiții a unui set de acțiuni.
3. Evenimente și reacții: În programarea vizuală, structurile de control pot fi legate de
evenimente specifice care se întâmplă în aplicație. Atunci când un anumit eveniment are
loc, se activează o reacție sau o secvență de acțiuni predefinite.
4. Întreruperi (break/continue): Aceste structuri sunt utilizate pentru a întrerupe sau a
continua execuția unei bucle în funcție de anumite condiții. Ele pot fi utilizate și în
programarea vizuală, oferind blocuri vizuale care permit controlul buclelor și a execuției
programului.

Structurile de control în programarea vizuală pot varia în funcție de platforma sau mediul de
dezvoltare utilizat. Exemple de medii de dezvoltare vizuale populare includ Scratch, Blockly,
LabVIEW și App Inventor. Fiecare mediu de dezvoltare vizuală oferă propriile blocuri vizuale și
elemente grafice pentru a configura structurile de control într-un mod intuitiv și accesibil pentru
programatori.

XIV. Noţiunile de control, proprietate și eveniment în programarea vizuală


În programarea vizuală, există trei noțiuni fundamentale: control, proprietate și eveniment.
Acestea sunt concepte cheie care permit programatorilor să creeze și să controleze aplicații prin
intermediul mediilor de dezvoltare vizuale.

1. Control: Un control reprezintă un element vizual (cum ar fi un buton, o casetă de


selectare, o imagine etc.) care permite interacțiunea utilizatorului cu aplicația.
Controalele pot fi plasate pe o interfață vizuală și pot avea funcționalități și
comportamente specifice. Ele pot fi utilizate pentru a afișa informații, pentru a primi
intrări de la utilizator sau pentru a acționa ca elemente interactive în cadrul aplicației.
2. Proprietate: O proprietate este o caracteristică sau o valoare asociată unui control sau
unui alt element vizual din aplicație. Aceasta poate fi utilizată pentru a configura sau a
modifica aspectul, comportamentul sau alte aspecte ale controlului sau elementului
vizual. De exemplu, o proprietate a unui buton poate fi culoarea sa de fundal sau textul
afișat.
3. Eveniment: Un eveniment este o acțiune sau o condiție specifică care are loc în aplicație.
Evenimentele pot fi declanșate de interacțiunea utilizatorului (cum ar fi apăsarea unui
buton) sau pot fi generate în mod automat (cum ar fi încheierea unei operații sau primirea
unei notificări). Programatorii vizuali pot lega acțiuni sau comportamente specifice de
evenimentele generate, astfel încât aplicația să reacționeze în mod corespunzător la
acestea. De exemplu, un eveniment de apăsare a unui buton poate declanșa o acțiune de
afișare a unui mesaj sau de navigare la o altă pagină.

Prin combinarea acestor trei noțiuni, programatorii vizuali pot crea aplicații interactive și
dinamice. Ei pot configura proprietăți ale controalelor, pot stabili reacții și acțiuni pe baza
evenimentelor generate și pot controla fluxul de execuție al aplicației prin intermediul
interacțiunii cu utilizatorul. Aceste concepte sunt fundamentale în programarea vizuală și
facilitează crearea de aplicații intuitive și accesibile pentru utilizatori.

XV. Butoane de comandă , butoane de opţiune și alte controale în programarea vizuală


În programarea vizuală, există o varietate de controale pe care le poți utiliza pentru a interacționa
cu aplicația și utilizatorii. Iată câteva exemple comune de controale în programarea vizuală:

1. Butoane de comandă (Button): Acestea sunt controale interactive care permit


utilizatorilor să execute o anumită acțiune atunci când butonul este apăsat. Butoanele de
comandă pot fi utilizate pentru a iniția procese, a trimite date sau a declanșa alte acțiuni
în aplicație.
2. Butoane de opțiune (Radio Button): Acestea sunt controale utilizate în special în cazul
selecției exclusive. Utilizatorii pot alege o singură opțiune dintr-o listă de opțiuni. Fiecare
buton de opțiune este asociat cu o valoare sau o etichetă specifică și utilizatorul poate
selecta doar una dintre ele.
3. Caseta de selectare (Checkbox): Este un control care permite utilizatorilor să aleagă sau
să dezactiveze o opțiune. În timp ce butoanele de opțiune permit selecția exclusivă,
casetele de selectare permit utilizatorilor să selecteze una sau mai multe opțiuni simultan.
4. Casetă de text (Text Box): Este un control care permite utilizatorilor să introducă și să
editeze text. Casetele de text sunt utilizate pentru a primi intrări de la utilizatori, cum ar fi
introducerea unui nume sau a unei valori.
5. Etichetă (Label): Este un control non-interactiv utilizat pentru a afișa text sau informații
statice în aplicație. Etichetele sunt folosite adesea pentru a oferi instrucțiuni, pentru a
indica informații sau pentru a afișa rezultate.
6. Lista (List Box): Este un control care afișează o listă de elemente din care utilizatorii pot
selecta una sau mai multe opțiuni. Utilizatorii pot face selecții din lista afișată și pot
executa acțiuni în funcție de selecțiile lor.

Acestea sunt doar câteva exemple de controale în programarea vizuală. Există și altele, cum ar fi
controalele pentru imagini, video, culori, date și multe altele. Mediile de dezvoltare vizuale oferă
o gamă largă de controale și opțiuni pentru a configura aspectul și comportamentul acestora în
aplicații. Programatorii vizuali pot utiliza aceste controale pentru a crea interfețe interactive și
intuitive pentru utilizatori.

XVI. Casete de text şi casete de validare. Vectori de controale în programarea vizuală


În programarea vizuală, casetele de text și casetele de validare sunt elemente utilizate pentru
introducerea și validarea datelor într-o aplicație.

Casetele de text sunt utilizate pentru a permite utilizatorilor să introducă texte sau valori
numerice într-un program. Acestea pot fi folosite pentru a colecta informații precum nume,
adrese, numere de telefon etc. Utilizatorul poate introduce text în caseta de text utilizând
tastatura sau alte dispozitive de intrare.

Casetele de validare, pe de altă parte, sunt utilizate pentru a verifica și valida datele introduse de
utilizator într-un program. Acestea pot avea diferite funcții de validare, cum ar fi verificarea
formatului datelor (de exemplu, validarea unei adrese de e-mail), verificarea lungimii textului
introdus sau validarea unui număr într-un anumit interval. Casetele de validare pot afișa, de
obicei, un mesaj de eroare sau un indiciu pentru utilizator în cazul în care datele introduse nu
sunt valide.

Vectorii de controale (uneori numiți și vectori de intrare) sunt utilizate în programarea vizuală
pentru a gestiona și manipula un set de casete de text sau de validare. Aceștia pot fi utilizați
pentru a colecta date de intrare de la utilizator sau pentru a afișa și verifica mai multe valori
simultan.
De exemplu, un vector de controale poate fi utilizat pentru a colecta informații despre mai mulți
studenți, având casete de text pentru introducerea numelor și vârstelor lor. Apoi, programul poate
utiliza vectorul de controale pentru a itera prin fiecare casetă de text și a obține valorile introduse
pentru fiecare student.

În concluzie, casetele de text și casetele de validare sunt utilizate în programarea vizuală pentru a
permite introducerea și validarea datelor într-o aplicație. Vectorii de controale sunt utilizați
pentru a gestiona și manipula mai multe astfel de casete simultan.

XVII. Liste simple şi liste combinate în programarea vizuală


În programarea vizuală, liste simple și liste combinate sunt utilizate pentru a stoca și manipula
colecții de date.

Listele simple (sau simple liste) sunt utilizate pentru a stoca o singură valoare sau o colecție de
valori de același tip de date. Acestea pot fi utilizate pentru a gestiona o listă de numere, texte,
imagini sau alte tipuri de date. Listele simple oferă metode și operații pentru adăugarea,
ștergerea, căutarea și modificarea elementelor din listă.

Listele combinate (sau liste de liste) sunt utilizate pentru a stoca colecții mai complexe de date,
în care fiecare element poate fi, la rândul său, o listă simplă. Acest lucru permite structurarea
datelor într-o formă ierarhică sau în mai multe niveluri. De exemplu, o listă combinate poate fi
utilizată pentru a reprezenta o listă de studenți, unde fiecare student are o listă de note sau o listă
de cursuri. Aceasta oferă flexibilitate în gestionarea și manipularea datelor structurate.

În programarea vizuală, atât listele simple, cât și listele combinate pot fi utilizate cu blocuri de
programare specifice pentru a efectua operații asupra datelor din listă. De exemplu, blocurile pot
permite adăugarea unui element într-o listă, ștergerea unui element dintr-o listă, parcurgerea
elementelor dintr-o listă și altele.

Utilizarea listelor simple și a listelor combinate în programarea vizuală oferă posibilitatea de a


organiza și manipula datele într-un mod eficient și flexibil. Acestea sunt utilizate într-o varietate
de aplicații, cum ar fi gestionarea bazelor de date, manipularea informațiilor structurate și
organizarea datelor într-un mod modular și extensibil.

XVIII. Evenimente și tratarea excepțiilor în programarea vizuală


În programarea vizuală, evenimentele reprezintă acțiuni sau interacțiuni ale utilizatorului cu
elementele grafice ale unei aplicații. Aceste evenimente pot fi, de exemplu, apăsarea unui buton,
mișcarea unui cursor sau introducerea unor date într-un câmp de text.

Tratarea excepțiilor în programarea vizuală este importantă pentru a gestiona situațiile de eroare
sau de neașteptat care pot apărea în timpul rulării aplicației. Excepțiile pot fi generate, de
exemplu, de operații de citire sau scriere în fișiere, de accesarea resurselor de rețea sau de erori
de sintaxă în cod.

Pentru a trata excepțiile în programarea vizuală, se pot utiliza blocuri de cod numite "try-catch".
Într-un bloc "try", se plasează codul care poate genera excepții, iar într-un bloc "catch" se
plasează codul care va fi executat în cazul în care o excepție este generată. În cadrul blocului
"catch", se pot efectua diverse acțiuni, cum ar fi afișarea unui mesaj de eroare sau resetarea unor
variabile.

În plus, în programarea vizuală există și alte mecanisme pentru tratarea excepțiilor, cum ar fi
blocurile "finally", care permit executarea unui cod indiferent de apariția sau tratarea unei
excepții, sau blocurile "throw", care permit generarea manuală a unei excepții într-un anumit
punct din cod.

Este important ca dezvoltatorul să fie atent la tratarea excepțiilor în programarea vizuală, pentru
a asigura o experiență de utilizare cât mai bună și pentru a preveni potențiale probleme sau erori
în aplicație.

XIX. Crearea şi utilizarea hiperlegăturilor HTML


Hiperlegăturile HTML (sau etichetele <a>) sunt utilizate pentru a crea legături sau link-uri între
pagini web. Ele permit utilizatorilor să facă clic pe un text sau pe o imagine și să fie
redirecționați către o altă pagină web, un fișier sau o ancore în cadrul aceleiași pagini.

Pentru a crea o hiperlegătură, utilizați următoarea sintaxă:

<a href="adresa-pagina">Textul legăturii</a>

Înlocuiți "adresa-pagina" cu URL-ul paginii web către care doriți să redirecționați utilizatorul și
"Textul legăturii" cu textul sau imaginea pe care doriți să le utilizați ca legătură. De exemplu:

<a href=" https://ums.ub.ro">Ai picat </a>


Această linie de cod va crea un link către https://ums.ub.ro și va afișa textul "Ai picat". Când un
utilizator face clic pe acest link, browserul lor va deschide pagina web specificată într-o nouă filă
sau fereastră, în funcție de setările lor.

Hiperlegăturile pot fi utilizate și pentru a crea link-uri interne către ancore în cadrul aceleiași
pagini. O ancoră este un punct de referință în cadrul unei pagini web către care utilizatorii pot să
sară direct. Pentru a crea un link către o ancoră, utilizați următoarea sintaxă:

<a href="#ancora">Salt la ancora</a>

Apoi, creați ancora utilizând eticheta <a name="ancora">. De exemplu:

<a name="ancora"></a>

Hiperlegăturile pot fi, de asemenea, folosite pentru a deschide adrese de e-mail sau pentru a
descărca fișiere. Pentru a deschide adresa de e-mail implicită a utilizatorului, utilizați următoarea
sintaxă:

<a href="mailto:adresa-email">Trimiteți un e-mail</a>

Pentru a descărca un fișier, utilizați următoarea sintaxă:

<a href="calea-fișierului">Descărcați fișierul</a>

Asigurați-vă că înlocuiți "adresa-email" cu adresa de e-mail corespunzătoare și "calea-


fișierului" cu calea fișierului pe care doriți să-l descărcați.

Acestea sunt doar câteva exemple de utilizare a hiperlegăturilor HTML. Există și alte atribute și
opțiuni disponibile, cum ar fi target="_blank" pentru a deschide link-ul într-o filă sau fereastră
nouă. Puteți explora mai multe opțiuni în documentația HTML sau prin consultarea resurselor
online despre acest subiect.

XX. Formulare HTML


Un formular HTML este o componentă a limbajului de marcare HTML care permite utilizatorilor
să trimită date către un server web. Aceasta este o metodă interactivă de a colecta informații de la
utilizatori prin intermediul unui site web.

Un formular HTML constă într-o colecție de elemente și etichete specifice, cum ar fi:
1. <form>: Eticheta principală care definește începutul și sfârșitul unui formular.
Atributul action specifică URL-ul sau scriptul către care datele formularului vor fi
trimise în momentul în care utilizatorul apasă butonul de trimitere.
2. <input>: Elementul principal utilizat pentru a crea diverse tipuri de câmpuri de
introducere a datelor, cum ar fi câmpuri de text, câmpuri de parolă, casete de
selectare, butoane radio, butoane de comutare și altele. Atributul type specifică tipul
de câmp.
3. <textarea>: Elementul utilizat pentru a permite utilizatorilor să introducă texte mai
lungi, cum ar fi mesaje sau comentarii.
4. <select> și <option>: Elementele utilizate pentru a crea liste de opțiuni și casete de
selectare.
5. <label>: Elementul utilizat pentru a furniza etichete și descrieri pentru câmpurile de
introducere. Acesta este asociat cu un element <input> utilizând atributul for.

Acestea sunt doar câteva dintre elementele cheie utilizate în construirea unui formular HTML.
Există și alte elemente și atribute disponibile pentru a personaliza și gestiona comportamentul
formularului.

Odată completat de către utilizator, formularul poate fi trimis către server pentru a fi prelucrat și
stocat sau pentru a executa acțiuni specifice în funcție de necesități. Aceasta permite
interacțiunea bidirecțională între utilizator și site-ul web.

XXI. Tipuri de formatare CSS - creare şi apelare, exemple


CSS (Cascading Style Sheets) este un limbaj de stilizare utilizat pentru a formata și a defini
aspectul și prezentarea elementelor HTML pe o pagină web. Există mai multe tipuri de formatare
CSS pe care le puteți crea și apela în fișierele CSS ale proiectului dvs. Iată câteva exemple de
tipuri de formatare CSS:

1. Selector de element: Formatarea se aplică la toate elementele HTML cu acel nume.

h1 {
color: blue;
font-size: 24px;
}
În acest exemplu, toate elementele <h1> vor avea culoarea albastră și dimensiunea fontului de 24
de pixeli.

2. Selector de clasă: Formatarea se aplică la toate elementele HTML care au clasa


specificată.

.accentuat {
color: red;
font-weight: bold;
}

În acest exemplu, toate elementele cu clasa "accentuat" vor avea culoarea roșie și vor fi
evidențiate prin greutatea fontului.

3. Selector de ID: Formatarea se aplică la un singur element HTML cu ID-ul specificat.

În acest exemplu, elementul cu ID-ul "logo" va avea o lățime de 200 de pixeli și o înălțime de
150 de pixeli.

4. Selector de atribut: Formatarea se aplică la elementele HTML care au un anumit atribut


specificat.
În acest exemplu, toate elementele <input> de tip text vor avea un chenar cu grosimea de 1 pixeli
și culoarea gri, precum și un spațiu intern de 5 pixeli.

5. Selector de pseudo-clasă: Formatarea se aplică la un element HTML într-o anumită stare


sau context.

#logo {
width: 200px;
În acest exemplu, link-
height: 150px;
urile (<a>) } vor avea
subliniere atunci când
cursorul mouse-ului este
deasupra lor.

Acestea sunt doar câteva exemple de tipuri de formatare CSS. Există și alte tipuri și opțiuni
disponibile în CSS pentru a personaliza aspectul și prezentarea elementelor HTML pe o pagină
web. Puteți combina diferite tipuri de selecție și specificatori pentru a obține rezultate mai
precise și flexibile în
stilizarea paginilor web.

input[type="text"] {
border: 1px solid gray;
padding: 5px;
}
XXII. Exemple de utilizare a funcţiilor Javascript

Funcțiile JavaScript sunt utilizate pentru a organiza și a reutiliza codul într-un mod modular. Ele
permit definirea unui bloc
de cod care poate fi
apelat în orice moment
function aduna(a, b) {
și de oriunde în var rezultat = a + b; codul
a:hover {
JavaScript. Iată return rezultat;
text-decoration: underline; câteva
exemple de } } utilizare a
funcțiilor
var suma = aduna(5, 3);
JavaScript:
console.log(suma); // Afișează 8
1. Funcții fără

argumente:

În acest exemplu, funcția salut() afișează mesajul "Salut, lume!" în consolă. Funcția este definită
fără argumente și poate fi apelată ori de câte ori este necesar.

2. Funcții cu argumente:

function salut() {
console.log("Salut, lume!");
}

salut(); // Apelarea funcției


var suma = function(a, b) {
return a + b;
};
În acest exemplu, funcția
console.log(suma(2, 3)); // Afișează 5
aduna(a, b) primește doi
parametri a și b și returnează
suma lor. Apelul funcției aduna(5, 3) atribuie rezultatul în variabila suma și apoi acesta este afișat
în consolă.

3. Funcții cu valori implicite pentru argumente:

În acest exemplu,
funcția salut(nume =
"Anonim") function salut(nume = "Anonim") { primește un
argument console.log("Salut, " + nume + "!"); opțional nume
}
cu o valoare implicită
"Anonim". Dacă nu este
salut(); // Afișează "Salut, Anonim!"
furnizat un salut("John"); // Afișează "Salut, John!" argument în
apelul funcției, valoarea
implicită va fi folosită.

4. Funcții anonime și expresii de funcții:


În acest exemplu, se utilizează o expresie de funcție pentru a atribui o funcție anonimă în
variabila suma. Această funcție poate fi apelată folosind variabila suma.

5. Funcții callback:

function calculeaza(a, b, operatie) {


return operatie(a, b);
}

function aduna(a, b) {
return a + b;
}

function inmulteste(a, b) {
return a * b;
}

console.log(calculeaza(2, 3, aduna)); // Afișează 5


console.log(calculeaza(2, 3, inmulteste)); // Afișează 6
În acest

exemplu, funcția calculeaza(a, b, operatie) primește doi parametri și o funcție operatie ca


argument. Apelurile funcțiilor aduna și inmulteste sunt pasate ca argument pentru a realiza
operații diferite în cadrul funcției calculeaza.

Acestea sunt doar câteva exemple de utilizare a funcțiilor JavaScript. Funcțiile sunt esențiale în
dezvoltarea web pentru a organiza și a reutiliza codul, a realiza operații complexe și a obține un
cod mai modular și mai ușor de întreținut.

XXIII. Definiţia clasică a probabilităţii


Definiția clasică a probabilității se bazează pe principiul că, într-un experiment aleatoriu în care
există un număr finit de rezultate posibile și fiecare rezultat are aceeași șansă de a se produce,
probabilitatea unui eveniment este dată de raportul dintre numărul de rezultate favorabile
evenimentului și numărul total de rezultate posibile.

Formal, dacă avem un experiment aleatoriu cu n rezultate posibile, dintre care m rezultate sunt
favorabile evenimentului A, probabilitatea evenimentului A este definită ca:

P(A) = m/n

Unde:

 P(A) reprezintă probabilitatea evenimentului A,


 m reprezintă numărul de rezultate favorabile evenimentului A,
 n reprezintă numărul total de rezultate posibile.

Această definiție presupune că toate rezultatele posibile au aceeași șansă de a se produce și că


experimentul este echitabil și independent.

De exemplu, în aruncarea unui zar echilibrat cu șase fețe numerotate de la 1 la 6, probabilitatea


obținerii unei anumite fețe, cum ar fi fețele cu numărul 4, este de 1/6, deoarece există o singură
față favorabilă (feța cu numărul 4) și șase rezultate posibile (fețele numerotate de la 1 la 6).
Această definiție clasică a probabilității este una dintre cele mai fundamentale și este utilizată în
multe domenii, inclusiv în teoria probabilităților, statistici și în analiza riscului.
XXIV. Scheme probabilistice clasice

Schemele probabilistice clasice sunt metode prin care se pot obține rezultate probabilistice într-
un mod riguros și bine definit. Aceste scheme sunt adesea utilizate în domeniul teoriei
probabilităților și al statisticilor pentru a evalua și cuantifica incertitudinea într-un proces
aleatoriu.

Iată câteva exemple de scheme probabilistice clasice:


 Aruncarea unei monede: Atunci când aruncăm o monedă corectă, avem două rezultate
posibile: cap sau pajură. Dacă moneda este echilibrată, probabilitatea obținerii unui cap
sau a unei pajure este de 1/2 pentru fiecare.
 Aruncarea unui zar: Atunci când aruncăm un zar obișnuit cu șase fețe, fiecare feță are o
probabilitate egală de 1/6 de a apărea într-o singură aruncare.
 Tragerea unei cărți dintr-un pachet standard de cărți: Într-un pachet standard de cărți,
există 52 de cărți, fiecare având o probabilitate de 1/52 de a fi extrasă într-o singură
tragere, cu condiția ca pachetul să fie bine amestecat.
 Lancerul de dărti: În acest joc, un jucător aruncă săgeți către o țintă cu segmente
numerotate. Probabilitatea de a lovi o anumită zonă poate fi evaluată pe baza abilității și
preciziei jucătorului.

Acestea sunt doar câteva exemple simple de scheme probabilistice clasice. În practică, există o
gamă largă de situații și probleme în care pot fi aplicate conceptele și metodele teoriei
probabilităților și ale statisticilor pentru a obține rezultate probabilistice.

XXV. Conceptul de distribuţie

Conceptul de distribuție în teoria probabilităților și statistici se referă la modul în care


probabilitățile sunt atribuite diferitelor evenimente sau valorilor într-un experiment sau într-o
populație. O distribuție descrie în esență modul în care se răspândesc valorile posibile ale unei
variabile aleatoare sau ale unei caracteristici într-un set de date sau într-o populație.

Există mai multe tipuri de distribuții utilizate pentru a modela diferite tipuri de fenomene
aleatoare. Iată câteva exemple comune:

 Distribuția uniformă: Într-o distribuție uniformă, fiecare valoare posibilă are aceeași
probabilitate de a apărea. De exemplu, aruncarea unei monede corecte sau aruncarea unui
zar echilibrat sunt exemple de distribuție uniformă.
 Distribuția normală (sau distribuția gaussiană): Este o distribuție simetrică în jurul
unei medii și este caracterizată de deviația standard. Multe fenomene din natură, cum ar fi
înălțimea persoanelor sau scorurile testelor standardizate, pot fi aproximativ descrise prin
distribuția normală.
 Distribuția exponentială: Această distribuție este adesea utilizată pentru a modela
evenimente rare, cum ar fi intervalele de timp între apariția unor evenimente
independente. De exemplu, timpul între sosirea a două mesaje consecutive pe un server
poate fi modelat printr-o distribuție exponentială.
 Distribuția Poisson: Această distribuție este utilizată pentru a modela numărul de
evenimente rare care apar într-un interval de timp sau spațiu fixat. Este adesea folosită în
domenii precum statistica accidentelor sau procesele de sosire în sistemul de coadă.

Acestea sunt doar câteva exemple de distribuții utilizate în teoria probabilităților și statistici.
Fiecare distribuție are propriile caracteristici și proprietăți specifice, iar alegerea distribuției
potrivite depinde de natura datelor sau fenomenului studiat. Distribuțiile pot fi utilizate pentru a
calcula probabilități, pentru a face inferențe statistice sau pentru a modela datele observate într-
un experiment sau într-o populație.

XXVI. Generarea numerelor aleatoare

Generarea numerelor aleatoare este un proces important în domeniul științei calculatoarelor, al


statisticii și al simulărilor. Există diferite metode și algoritmi pentru a genera numere aleatoare,
fie că este vorba de numere cu adevărat aleatoare sau de numere pseudo-aleatoare.

 Generarea numerelor pseudo-aleatoare: Aceasta este cea mai comună metodă de


generare a numerelor aleatoare pe calculatoare. Algoritmii de generare a numerelor
pseudo-aleatoare utilizează o formulă matematică pentru a genera o secvență de numere
care par a fi aleatoare. Cu toate acestea, secvența de numere generate este deterministă și
se repetă în mod ciclic. O valoare de pornire, numită și seed, este utilizată pentru a
inițializa generatorul de numere pseudo-aleatoare, iar apoi se generează secvența de
numere bazată pe acest seed. Algoritmul comun utilizat pentru generarea numerelor
pseudo-aleatoare este algoritmul Mersenne Twister.
 Generarea numerelor aleatoare cu adevărat: Pentru unele aplicații, este necesară
generarea numerelor cu adevărat aleatoare, care nu pot fi prevăzute sau replicate. Aceasta
poate fi realizată utilizând surse fizice de aleatoritate, cum ar fi zgomotul termic sau
măsurătorile cuanticelor. Aceste surse sunt utilizate pentru a genera numere aleatoare cu
ajutorul unor dispozitive hardware specializate.
Indiferent de metoda folosită, generarea numerelor aleatoare se bazează pe un algoritm care
produce o secvență de valori. Pentru a asigura variabilitatea și distribuția uniformă a numerelor
generate, este important să se folosească un seed inițial diferit în cazul numerelor pseudo-
aleatoare și să se utilizeze algoritmi de generare testați și recunoscuți.

Este de remarcat că, în cazul generării numerelor pseudo-aleatoare, secvența generată poate fi
repetată în cazul în care seed-ul inițial este același. Pentru a evita acest lucru, seed-ul poate fi
inițializat pe baza unui factor variabil, cum ar fi timpul curent al sistemului, pentru a obține
secvențe diferite în fiecare rulare a programului.

Generarea numerelor aleatoare joacă un rol crucial în simulări, criptografie, jocuri de noroc,
analiza statistică și multe alte domenii în care aleatoriul este esențial.

XXVII. Problema celui mai scurt drum în grafuri

Problema celui mai scurt drum în grafuri este o problemă comună în teoria grafurilor și în
algoritmică. Scopul acestei probleme este de a găsi cel mai scurt drum între două noduri într-un
graf ponderat, adică drumul cu cea mai mică sumă a ponderilor muchiilor.

Există mai multe algoritme eficiente pentru rezolvarea problemei celui mai scurt drum în grafuri.
Iată câteva dintre cele mai cunoscute algoritme:

 Algoritmul Dijkstra: Acesta este un algoritm clasic pentru găsirea celui mai scurt drum
într-un graf ponderat cu ponderi pozitive. Algoritmul Dijkstra utilizează o coadă de
priorități și actualizează distanțele minime către nodurile adiacente pe măsură ce se
parcurge graful. La final, algoritmul găsește cel mai scurt drum de la nodul sursă la toate
celelalte noduri.
 Algoritmul Bellman-Ford: Acest algoritm poate fi utilizat pentru a găsi cel mai scurt
drum într-un graf ponderat cu ponderi pozitive sau negative, cu excepția cazului în care
există un ciclu negativ. Algoritmul Bellman-Ford actualizează în mod repetat estimările
distanțelor minime până când nu mai are loc nicio actualizare. Algoritmul găsește cel mai
scurt drum de la nodul sursă la toate celelalte noduri și poate detecta și ciclurile negative.
 Algoritmul Floyd-Warshall: Acest algoritm poate fi utilizat pentru a găsi cel mai scurt
drum între toate perechile de noduri într-un graf ponderat, inclusiv grafuri cu ponderi
negative, cu excepția cazului în care există cicluri negative. Algoritmul Floyd-Warshall
construiește o matrice de distanțe minime care conține cele mai scurte distanțe între
fiecare pereche de noduri.

Acestea sunt doar câteva exemple de algoritme pentru rezolvarea problemei celui mai scurt drum
în grafuri. Alegerea algoritmului potrivit depinde de specificul grafului și de cerințele problemei.
Fiecare algoritm are avantajele și limitările sale și poate fi optim în anumite situații.

XXVIII. Problema fluxului maxim în reţele

Problema fluxului maxim în rețele este o problemă importantă în teoria grafurilor și în rețelele de
transport. Scopul acestei probleme este de a determina cel mai mare flux posibil care poate fi
transmis de la sursă la destinație într-o rețea cu capacități definite pe muchii.

Formal, problema fluxului maxim este definită pe un graf orientat ponderat, numit rețea, care
este alcătuit dintr-un set de noduri și muchii. Fiecare muchie are o capacitate care reprezintă
cantitatea maximă de flux care poate trece prin acea muchie. De asemenea, se specifică un nod
sursă și un nod destinație.

Scopul este de a găsi o distribuție a fluxului în rețea care respectă capacitățile muchiilor și care
maximizează suma fluxurilor care intră în nodul destinație și care sunt generate în nodul sursă.
Fluxul trebuie să respecte două proprietăți: conservarea fluxului și capacitatea limitată.

Există mai multe algoritme utilizate pentru rezolvarea problemei fluxului maxim în rețele. Iată
câteva dintre cele mai cunoscute:

 Algoritmul Ford-Fulkerson: Acest algoritm folosește o strategie de căutare în adâncime


pentru a găsi un lanț augmentat în rețea și pentru a crește fluxul în acest lanț. Algoritmul
se repetă până când nu mai există lanțuri augmentate, moment în care se obține fluxul
maxim.
 Metoda Edmonds-Karp: Această metodă este o variantă a algoritmului Ford-Fulkerson
care utilizează o strategie de căutare în lățime în loc de căutare în adâncime. Acest lucru
asigură că se găsește cel mai scurt lanț augmentat la fiecare iterație și duce la o
complexitate mai bună în practică.
 Algoritmul Dinic: Acesta este un algoritm eficient pentru rezolvarea problemei fluxului
maxim în rețele. Algoritmul se bazează pe conceptul de blocaj și utilizează o serie de
căutări în lățime pentru a găsi blocajele și pentru a le elimina, crescând astfel fluxul
maxim.

Acestea sunt doar câteva exemple de algoritme utilizate pentru rezolvarea problemei fluxului
maxim în rețele. Problema fluxului maxim este esențială în proiectarea și analiza rețelelor de
transport, în optimizarea rutelor de comunicație și în alte domenii în care este necesară eficiența
maximă a fluxului de resurse într-un sistem.

XXIX. Rezolvarea sistemelor algebrice liniare-metode directe

Metodele directe pentru rezolvarea sistemelor algebrice liniare se referă la metodele care
furnizează o soluție exactă într-un număr finit de pași. Aceste metode se bazează pe algoritmi
matematici care transformă sistemul de ecuații într-o formă echivalentă, ușor de rezolvat. Trei
metode directe comune pentru rezolvarea sistemelor algebrice liniare sunt eliminarea Gaussiană,
factorizarea LU, metoda inversă.

 Eliminarea Gaussiană: Această metodă implică aplicarea unor operații elementare


asupra sistemului de ecuații pentru a-l aduce într-o formă echivalentă, în care variabilele
sunt izolate pe coloane. Pas cu pas, se elimină variabilele necunoscute prin substituție,
reducând sistemul la o formă treptată. La finalul procesului, se obține un sistem
echivalent, denumit forma echilibrată (sau forma escalonată), care poate fi rezolvat ușor
prin substituție inversă.
 Factorizarea LU: Această metodă presupune descompunerea matricei coeficienților
sistemului într-un produs de două matrice, L și U, unde L este o matrice triunghiulară
inferior, iar U este o matrice triunghiulară superior. Descompunerea se realizează prin
aplicarea unor operații elementare asupra matricei coeficienților, astfel încât să se obțină
o forma echivalentă factorizată. După obținerea factorizării LU, sistemul inițial poate fi
rezolvat în două etape separate: înlocuirea înainte și înlocuirea înapoi. Aceste etape
implică rezolvarea a două sisteme de ecuații triunghiulare, care este mai eficient decât
rezolvarea directă a sistemului inițial.
 Metoda inversă: Această metodă presupune calculul inversului matricei coeficienților și
apoi înmulțirea acestuia cu vectorul termenilor liberi pentru a găsi soluția sistemului.
Această metodă este mai costisitoare computațional decât metodele anterioare și poate
duce la erori numerice în anumite situații.

Pentru a alege metoda potrivită de rezolvare a unui sistem algebric liniar, este important să se
țină cont de dimensiunea matricei și de structura sistemului, precum și de resursele de calcul
disponibile. Metodele directe sunt de obicei preferate pentru sistemele mici și bine condiționate,
în timp ce sistemele mari și slab condiționate pot beneficia de metode iterative.

XXX. Rezolvarea sistemelor algebrice liniare-metode iterative

Rezolvarea sistemelor algebrice liniare folosind metode iterative implică aproximarea soluției
sistemului printr-un proces iterativ succesiv, până când se atinge o precizie satisfăcătoare. Aceste
metode pot fi mai eficiente pentru sistemele mari sau slab condiționate, deoarece evită calculul
costisitor al matricelor inverse sau factorizărilor.

Iată câteva dintre cele mai utilizate metode iterative pentru rezolvarea sistemelor algebrice
liniare:

 Metoda Jacobi: Metoda Jacobi este o metodă simplă și ușor de implementat. Aceasta
implică împărțirea matricei extinse într-o matrice diagonală și două matrice adiționale. În
fiecare iterație, necunoscutele sunt actualizate folosind valorile anterioare și elementele
matricelor adiționale. Metoda converge către soluție dacă matricea coeficienților este
strict diagonal dominantă sau simetric pozitiv definită.
 Metoda Gauss-Seidel: Această metodă este similară cu metoda Jacobi, dar folosește
valorile actualizate ale necunoscutei la fiecare pas în cadrul aceleiași iterații. Deoarece
metoda utilizează valorile recent calculate, converge mai rapid decât metoda Jacobi
pentru sistemele bine condiționate.
 Metoda relaxării (metoda supra-relaxării): Aceasta este o variantă a metodei Gauss-
Seidel, care introduce un factor de relaxare (numit și factor omega) pentru a accelera
convergența. Factorul de relaxare controlează cât de mult ar trebui să depășească valoarea
calculată noua valoare a necunoscutei la fiecare iterație. O alegere potrivită a acestui
factor poate accelera convergența.
 Metoda gradientului conjugat: Această metodă este adecvată pentru sistemele simetrice
pozitiv definite. Utilizează o serie de direcții conjugate pentru a minimiza eroarea în
fiecare iterație, asigurând astfel o convergență rapidă.
 Metoda supra-relaxării succesive (SOR - Successive Over-Relaxation): Aceasta este o
extensie a metodei relaxării, care introduce un factor de relaxare în metoda Gauss-Seidel.
Factorul de relaxare optimizează viteza de convergență și poate fi ajustat pentru a obține
un compromis între stabilitate și viteză.

În general, metodele iterative sunt mai puțin costisitoare din punct de vedere computațional decât
metodele directe pentru sisteme mari. Cu toate acestea, alegerea unei metode potrivite depinde
de proprietățile sistemului și de gradul de precizie necesar. De asemenea, unele metode pot
converge mai rapid pentru anumite tipuri de sisteme, iar altele pot necesita un număr mai mare
de iterații pentru a atinge aceeași precizie.

XXXI. Rezolvarea numerică a problemelor algebrice de valori şi vectori proprii

Rezolvarea numerică a problemelor algebrice de valori și vectori proprii implică determinarea


valorilor proprii și a vectorilor proprii asociate unei matrice. Aceste probleme au o importanță
deosebită în diverse domenii științifice și inginerie, deoarece valorile și vectorii proprii oferă
informații despre comportamentul matricei și sistemului asupra căruia este definită.

Există mai multe metode numerice utilizate pentru rezolvarea acestor probleme, dintre care cele
mai comune sunt:

 Metoda puterii (Power method): Aceasta este una dintre cele mai simple și mai utilizate
metode pentru a găsi cea mai mare valoare proprie și vectorul propriu asociat unei
matrice. Metoda implică aplicarea repetată a matricei pe un vector inițial și normalizarea
rezultatului la fiecare pas. Vectorul rezultat converge către vectorul propriu asociat celei
mai mari valori proprii.
 Metoda puterii inverse (Inverse power method): Această metodă este o variantă a
metodei puterii și este utilizată pentru a găsi cea mai mică valoare proprie și vectorul
propriu asociat unei matrice. În loc să se aplice matricea direct, se aplică inversa ei.
Astfel, vectorul rezultat converge către vectorul propriu asociat celei mai mici valori
proprii.
 Metoda puterii directe (Direct power method): Această metodă generalizată permite
găsirea unei valori proprii specifice și a vectorului propriu asociat acelei valori. Metoda
implică utilizarea unei deflații iterative pentru a elimina valoarea și vectorul propriu
găsite la fiecare iterație anterioară. Astfel, se obține o matrice redusă și se continuă
iterațiile până când se găsesc toate valorile și vectorii proprii.
 Metoda Jacobi: Această metodă se bazează pe transformări ortogonale pentru a
diagonaliza matricea într-o formă diagonală. Pașii metodei implică selectarea celor mai
mari elemente nenule din matrice pentru a fi anulați prin aplicarea unor rotații Jacobi.
Procesul continuă până când matricea devine diagonală sau până când criteriul de oprire
este îndeplinit.
 Metoda QR: Această metodă implică factorizarea matricei inițiale într-un produs de o
matrice ortogonală (Q) și o matrice superior triunghiulară (R). În fiecare iterație, se
obține o factorizare QR a matricei și se înmulțesc matricea Q și matricea R obținute în
iterațiile anterioare. Procesul continuă până când matricea devine suficient de aproape de
o formă diagonală.

Acestea sunt doar câteva dintre metodele numerice utilizate pentru rezolvarea problemelor
algebrice de valori și vectori proprii. Alegerea unei metode depinde de dimensiunea matricei,
structura matricei, precizia dorită și resursele de calcul disponibile. În practică, se utilizează
adesea biblioteci și software specializate care implementează aceste metode și oferă
funcționalități avansate pentru rezolvarea numerică a problemelor de valori și vectori proprii.

XXXII. Aproximarea funcţiilor prin polinoame. Polinom Lagrange de interpolare

Aproximarea funcțiilor prin polinoame este o metodă comună utilizată în analiză numerică și
teoria aproximării. Polinomul Lagrange de interpolare este una dintre metodele utilizate pentru a
găsi un polinom care trece prin punctele de date cunoscute și este folosit pentru a estima valori
intermediare ale funcției.

Polinomul Lagrange de interpolare pentru un set de puncte de date $(x_0, y_0), (x_1, y_1), \
ldots, (x_n, y_n)$ este definit astfel:
Unde $l_i(x)$ sunt funcțiile Lagrange asociate punctelor de date și sunt definite astfel:

Practic, funcția $l_i(x)$ are proprietatea că $l_i(x_i) = 1$ și $l_i(x_j) = 0$ pentru $j \neq i$, ceea
ce înseamnă că polinomul Lagrange trece prin punctul $(x_i, y_i)$ și este zero în celelalte
puncte.

Pasul de construcție al polinomului Lagrange de interpolare este următorul:

 Se pornește de la un set de puncte de date $(x_0, y_0), (x_1, y_1), \ldots, (x_n, y_n)$.
 Se definește fiecare funcție Lagrange $l_i(x)$ conform formulei de mai sus.
 Se construiește polinomul Lagrange de interpolare $P(x)$ prin înmulțirea fiecărei funcții
Lagrange cu valoarea corespunzătoare a punctului de date și apoi adunarea rezultatelor.

Este important de menționat că polinomul Lagrange de interpolare poate fi utilizat pentru a


estima valori intermediare ale funcției, dar poate suferi de fenomenul de interpolare Runge, în
care aproximarea polinomială devine instabilă în preajma capetelor intervalului de interpolare. În
astfel de cazuri, se pot utiliza alte metode de aproximare, cum ar fi metoda polinomului Newton
sau spline-urile.

Polinomul Lagrange de interpolare poate fi implementat relativ ușor în limbaje de programare,


iar calculul valorilor polinomului în puncte noi se poate face eficient prin evaluarea directă a
expresiei polinomiale.

XXXIII. Aproximarea funcţiilor prin polinoame. Polinoame Newton de interpolare.

Aproximarea funcțiilor prin polinoame este o tehnică folosită în analiza numerică și teoria
aproximării pentru a găsi o funcție polinomială care să se apropie cât mai bine de
comportamentul unei funcții date. Polinoamele Newton de interpolare sunt una dintre metodele
utilizate în acest scop.

Polinoamele Newton de interpolare sunt definite pe baza unui set de puncte de date cunoscute și
folosite pentru a construi un polinom care trece prin aceste puncte. Forma generală a unui
polinom Newton de interpolare este:
Unde $f[x_0,x_1,\ldots,x_k]$ reprezintă diferența divizată de ordin k a funcției în raport cu
punctele de date $(x_0, y_0), (x_1, y_1), \ldots, (x_k, y_k)$. Aceste diferențe divizate pot fi
calculate recursiv astfel:

Pasul de construcție al polinomului Newton de interpolare este următorul:

 Se pornește de la un set de puncte de date $(x_0, y_0), (x_1, y_1), \ldots, (x_n, y_n)$.
 Se calculează diferențele divizate $f[x_i, x_{i+1}, \ldots, x_{i+k}]$ pentru toate
combinațiile de puncte.
 Se construiește polinomul Newton de interpolare $P(x)$ utilizând formula de mai sus,
înlocuind diferențele divizate și termenii $(x-x_i)$ corespunzător.

Polinoamele Newton de interpolare au avantajul că pot fi calculate eficient, mai ales atunci când
trebuie adăugate sau eliminate puncte de interpolare, deoarece diferențele divizate se pot
actualiza în mod incremental. De asemenea, acestea pot fi utilizate pentru a estima valori
intermediare ale funcției și sunt mai puțin susceptibile la fenomenul de interpolare Runge decât
polinoamele Lagrange.

Implementarea polinoamelor Newton de interpolare poate fi realizată în diferite limbaje de


programare, iar evaluarea valorilor polinomului în puncte noi se poate face eficient utilizând
forma generală a polinomului.

XXXIV. Generarea de conţinut HTML folosind PHP.

Generarea de conținut HTML folosind PHP este o sarcină comună în dezvoltarea web. PHP este
un limbaj de programare interpretat pe latura serverului care poate genera dinamic codul HTML
în funcție de logica și datele furnizate. Acest lucru permite crearea și personalizarea paginilor
web în timp real.

Pentru a genera conținut HTML folosind PHP, urmați acești pași de bază:
1. Deschideți o etichetă PHP: Pentru a începe secțiunea PHP într-un fișier HTML,
deschideți o etichetă PHP folosind <?php sau <?= (abreviere pentru <?php echo).
2. Scrieți cod PHP: În interiorul etichetei PHP, puteți scrie codul PHP necesar pentru a
manipula datele, efectua calcule și genera conținut HTML dinamic. De exemplu, puteți
utiliza instrucțiuni de control (if, for, while) și variabile pentru a construi structura și
conținutul paginii.

3.
Închideți
<h1>Bun venit, <?php echo $nume; ?>!</h1>
<p>Ai <?php echo $varsta; ?> de ani.</p>

<p>Aceasta este o pagină generată dinamic folosind


PHP.</p>

<?php
// Alte instrucțiuni PHP
?>

eticheta PHP: După ce ați scris codul PHP, închideți eticheta PHP folosind ?>. După
închiderea etichetei PHP, puteți continua să scrieți codul HTML normal.
<?php
$nume = "John Doe";
$varsta = 30;
4. ?>
Salvarea
<h1>Bun venit, <?php echo $nume; ?>!</h1>
<p>Ai <?php echo $varsta; ?> de ani.</p>

fișierului cu extensia .php: Pentru ca PHP să fie interpretat și să genereze conținutul


HTML, salvați fișierul cu extensia .php, de exemplu, "pagina.php".
5. Accesarea paginii PHP: Accesați pagina PHP într-un browser pentru a vedea conținutul
HTML generat dinamic de către PHP.

În exemplul de mai sus, variabilele $nume și $varsta sunt definite în codul PHP, iar apoi sunt
utilizate în interiorul codului HTML pentru a afișa numele și vârsta într-un mod dinamic.

Aceasta este doar o introducere simplă în generarea de conținut HTML folosind PHP. PHP oferă
și alte funcții și caracteristici avansate pentru manipularea datelor și generarea dinamică a
conținutului HTML, cum ar fi manipularea formularilor, conectarea la baze de date, includerea
altor fișiere PHP etc.

XXXV. Utilizarea în PHP a datelor din formulare HTML. Metodele PUT şi GET.

În PHP, pentru a utiliza datele dintr-un formular HTML, puteți utiliza metodele PUT și GET.
Acestea sunt două metode HTTP utilizate pentru a trimite date de la un formular HTML la un
script PHP.

1. Metoda GET: Metoda GET trimite datele formularului prin adăugarea acestora în URL-ul
de solicitare. Datele sunt vizibile în bara de adrese a browserului și pot fi marcate ca
"bookmark-uri" sau "favorite". În PHP, datele sunt accesibile prin intermediul
superglobalului $_GET.

Exemplu de formular HTML cu metoda GET:

Exemplu de script PHP (script.php) pentru a accesa datele:

În acest
exemplu, <form action="script.php" method="GET">
valoarea <input type="text" name="nume">
<input type="submit" value="Trimite">
introdusă în câmpul
</form>
de text este
transmisă prin metoda

<?php
if (isset($_GET['nume'])) {
$nume = $_GET['nume'];
echo "Numele introdus: " . $nume;
}
?>
GET către scriptul PHP script.php. Valoarea este apoi accesată prin intermediul variabilei
$_GET['nume'].

2. Metoda PUT: Metoda PUT este utilizată pentru a trimite datele formularului în corpul
solicitării HTTP. Aceasta nu este suportată nativ în HTML și PHP, dar poate fi simulată
folosind metode suplimentare, cum ar fi AJAX sau biblioteci externe.

Exemplu de formular HTML simulat cu metoda PUT:

<form action="script.php" method="POST">


<input type="hidden" name="_method"
value="PUT">
<input type="text" name="nume">
<input type="submit" value="Trimite">
</form>

<?php
if ($_SERVER['REQUEST_METHOD'] === 'PUT') {
parse_str(file_get_contents("php://input"), $_PUT);
if (isset($_PUT['nume'])) {
$nume = $_PUT['nume'];
echo "Numele introdus: " . $nume;
}
}
?>

Exemplu de script PHP (script.php) pentru a accesa datele:


În acest exemplu, metoda PUT este simulată prin adăugarea unui câmp ascuns <input
type="hidden" name="_method" value="PUT"> în formularul HTML. Apoi, în scriptul PHP, se
verifică metoda solicitării prin intermediul $_SERVER['REQUEST_METHOD'] și se accesează
datele folosind funcția parse_str() pentru a analiza corpul solicitării.

Este important să menționăm că, în general, utilizarea metodei PUT este mai complexă în PHP și
necesită configurări suplimentare pentru a funcționa corespunzător.

Rețineți că metoda POST este adesea utilizată pentru a trimite date de la un formular HTML
către un script PHP. Metodele GET și PUT sunt utilizate în special în scenarii specifice sau în
împrejurări în care se dorește un control mai avansat al transmiterii datelor.

XXXVI. Utilizarea sistemului PHPMyAdmin

PHPMyAdmin este o aplicație web bazată pe PHP care permite gestionarea și administrarea
bazelor de date MySQL prin intermediul unui interfață grafică. Este o unealtă populară și ușor de
utilizat pentru a interacționa cu bazele de date MySQL.

Pentru a utiliza PHPMyAdmin, urmați acești pași:

 Instalare: Asigurați-vă că aveți PHPMyAdmin instalat pe serverul dvs. Dacă nu este deja
instalat, consultați documentația PHPMyAdmin pentru a obține informații despre
instalarea și configurarea acestuia.
 Accesare: Deschideți un browser și introduceți URL-ul de acces la PHPMyAdmin. De
obicei, acesta este de forma http://adresa_serverului/phpmyadmin/, unde
adresa_serverului este adresa IP sau numele domeniului serverului pe care este instalat
PHPMyAdmin.
 Autentificare: Veți fi întâmpinat cu o pagină de autentificare. Introduceți numele de
utilizator și parola corespunzătoare pentru a accesa interfața PHPMyAdmin.
 Selectați baza de date: După autentificare, veți fi redirecționat către panoul de control
PHPMyAdmin. Aici veți vedea lista bazelor de date disponibile pe serverul dvs. Selectați
baza de date cu care doriți să interacționați.
 Utilizarea funcționalităților PHPMyAdmin: PHPMyAdmin oferă o gamă largă de
funcționalități pentru gestionarea bazelor de date. Puteți crea, modifica sau șterge tabele,
insera sau actualiza date, rula interogări SQL, gestiona utilizatori și privilegii, efectua
copii de siguranță și multe altele. Interfața PHPMyAdmin este organizată în tabele și
meniuri, ceea ce face navigarea și utilizarea funcționalităților destul de intuitivă. Puteți
explora diverse opțiuni și meniuri pentru a vă administra baza de date conform
necesităților dvs.
Este important să menționăm că PHPMyAdmin poate fi o unealtă puternică și trebuie utilizată cu
grijă, mai ales când vine vorba de operațiuni de modificare și ștergere a datelor. Asigurați-vă că
aveți o copie de siguranță a bazelor de date importante și că aveți cunoștințele necesare pentru a
utiliza corect și în siguranță PHPMyAdmin.
XXXVII. Interogări SQL.

Interogările SQL (Structured Query Language) sunt utilizate pentru a comunica cu bazele de date
relaționale și a extrage, modifica sau manipula datele din acestea. SQL este un limbaj
standardizat care oferă un set de instrucțiuni și comenzi pentru a efectua operațiuni asupra
datelor din bazele de date.

Iată câteva exemple de interogări SQL comune:

1. Selectarea datelor dintr-o tabelă:

SELECT * FROM nume_tabel;

Această interogare selectează toate înregistrările din tabela nume_tabel și returnează toate
coloanele din acea tabelă.

2. Selectarea anumitor coloane dintr-o tabelă:


SELECT coloana1, coloana2 FROM nume_tabel;

Această interogare selectează valorile din coloanele coloana1 și coloana2 din tabela
nume_tabel.

3. Selectarea datelor cu condiții:

SELECT * FROM nume_tabel WHERE conditie;

Această interogare selectează toate înregistrările din tabela nume_tabel care îndeplinesc o
anumită condiție specificată în instrucțiunea WHERE.

4. Sortarea datelor:

SELECT * FROM nume_tabel ORDER BY coloana ASC/DESC;

Această interogare selectează toate înregistrările din tabela nume_tabel și le sortează în ordine
crescătoare (ASC) sau descrescătoare (DESC) în funcție de valorile din coloana specificată.

5. Înserarea datelor într-o tabelă:


INSERT INTO nume_tabel (coloana1, coloana2) VALUES (valoare1, valoare2);

Această interogare inserează o nouă înregistrare în tabela nume_tabel cu valorile specificate


pentru coloana1 și coloana2.

6. Actualizarea datelor într-o tabelă:

UPDATE nume_tabel SET coloana = noua_valoare WHERE conditie;

Această interogare actualizează valorile dintr-o coloană (coloana) în tabela nume_tabel conform
unei anumite condiții (conditie).

7. Ștergerea datelor dintr-o tabelă:

DELETE FROM nume_tabel WHERE conditie;

Această interogare șterge înregistrările din tabela nume_tabel care îndeplinesc o anumită
condiție specificată în instrucțiunea WHERE.

Acestea sunt doar câteva exemple de interogări SQL de bază. SQL oferă multe alte funcționalități
și instrucțiuni care permit filtrarea, agregarea, gruparea și alte operațiuni complexe asupra
datelor. Este recomandat să consultați documentația specifică pentru baza de date pe care o
utilizați pentru a înțelege complet sintaxa și caracteristicile specifice ale interogărilor SQL.

XXXVIII. Metoda Greedy. Exemple

Metoda Greedy este o tehnică algoritmică în care se iau decizii locale optime în fiecare pas, în
speranța că acestea vor duce la o soluție globală optimă. Algoritmul Greedy selectează mereu
opțiunea cea mai bună în acel moment, fără a se uita în viitor sau a lua în considerare toate
posibilitățile.

Exemple de algoritmi Greedy includ:

 Algoritmul Greedy pentru problema rucsacului: Aceasta este o problemă de


optimizare în care trebuie să alegeți obiecte cu valori și greutăți specifice pentru a umple
un rucsac cu capacitate limitată, astfel încât valoarea totală a obiectelor să fie maximă.
Algoritmul Greedy pentru această problemă alege mereu obiectul cu cea mai mare
valoare-raportată la greutate-până când rucsacul este plin.
 Algoritmul Greedy pentru problema acoperirii setului: Aceasta este o problemă în
care trebuie să alegeți un set de intervale pentru a acoperi un interval de timp dat,
utilizând cel mai mic număr posibil de intervale. Algoritmul Greedy pentru această
problemă alege întotdeauna intervalele care acoperă cel mai mult din intervalul dat și
elimină intervalele care se suprapun cu acestea.
 Algoritmul Greedy pentru problema monedelor: Aceasta este o problemă în care
trebuie să returnați un număr minim de monede pentru a atinge o sumă dată. Algoritmul
Greedy pentru această problemă alege întotdeauna moneda cu cea mai mare valoare care
poate fi folosită, până când suma dorită este atinsă.

Este important de menționat că, deși algoritmul Greedy poate oferi soluții rapide și ușor de
implementat în anumite situații, acesta nu garantează întotdeauna obținerea celei mai bune soluții
globale. Uneori, deciziile locale luate de algoritmul Greedy pot duce la soluții suboptimale sau
incorecte în cazuri complexe. Prin urmare, este important să analizați și să verificați
corectitudinea algoritmului Greedy înainte de a-l utiliza într-un context specific.

XXXIX. Metoda Backtracking. Exemple.


Metoda Backtracking este o tehnică de căutare sistematică a soluțiilor în care se explorează
recursiv toate posibilitățile, renunțând la acele soluții care nu îndeplinesc anumite condiții (prin
intermediul așa-numitei funcții de "verificare"). Algoritmul Backtracking revine asupra deciziilor
anterioare în cazul în care o soluție parțială nu poate fi extinsă pentru a ajunge la o soluție finală.
Este o metodă eficientă pentru a rezolva probleme combinatorii și de optimizare.

Exemple de algoritmi Backtracking includ:

 Algoritmul Backtracking pentru problema reginelor: Aceasta este o problemă în care


trebuie să plasați n regine pe o tablă de șah de dimensiune nxn astfel încât nicio regină să
nu poată ataca o alta. Algoritmul Backtracking explorează toate posibilitățile de plasare a
reginelor, revenind asupra deciziilor anterioare în cazul în care o soluție parțială nu poate
fi extinsă într-o soluție finală validă.

 Algoritmul Backtracking pentru problema labirintului: Aceasta este o problemă în


care trebuie să găsiți un drum dintr-un punct de start la un punct de destinație într-un
labirint. Algoritmul Backtracking explorează recursiv toate direcțiile posibile în labirint,
renunțând la acele căi care duc la blocaje sau impasuri, și revine asupra deciziilor
anterioare pentru a găsi un drum valid.
 Algoritmul Backtracking pentru problema permutărilor: Aceasta este o problemă în
care trebuie să generați toate permutările posibile ale unui set de elemente. Algoritmul
Backtracking explorează recursiv toate posibilitățile de plasare a elementelor în poziții
diferite, renunțând la acele combinații care nu îndeplinesc condițiile, și revine asupra
deciziilor anterioare pentru a genera toate permutările valide.

Acestea sunt doar câteva exemple de probleme care pot fi rezolvate folosind algoritmi
Backtracking. Este important de menționat că algoritmul Backtracking poate fi foarte eficient în
rezolvarea unor probleme combinatorii, dar complexitatea sa poate crește exponential în funcție
de dimensiunea problemei, deoarece explorează toate posibilitățile. Prin urmare, în cazul unor
probleme de dimensiuni mari, poate fi necesară optimizarea sau găsirea altor metode de
rezolvare.

XL. Metoda Divide et Impera. Exemple

Metoda "Divide et Impera" (împărțește și cucerește) este o tehnică algoritmica care constă în
rezolvarea unei probleme prin împărțirea ei în subprobleme mai mici, rezolvarea acestora și
combinarea soluțiilor pentru a obține soluția finală. Această metodă se bazează pe principiul că
este mai ușor să rezolvăm problemele mai mici în mod individual și apoi să combinăm
rezultatele.

Iată câteva exemple de algoritmi care utilizează metoda "Divide et Impera":

 Sortarea prin interclasare (Merge Sort): Merge Sort împarte lista inițială în două
subliste egale, apoi sortează separat fiecare sublistă și le combină într-o singură listă
sortată. Aceasta este o abordare tipică "Divide et Impera", în care lista este divizată în
bucăți mai mici, sortate separat și apoi combinate într-o soluție finală sortată.
 Căutarea binară: Căutarea binară este o tehnică eficientă de căutare a unui element într-
o listă sortată. Algoritmul împarte repetat lista în jumătate și compară elementul căutat cu
elementul din mijloc. Pe baza rezultatului comparației, căutarea continuă în jumătatea
corespunzătoare până când elementul este găsit sau lista este epuizată. Aceasta este o
abordare "Divide et Impera" în care problema căutării este divizată în subprobleme mai
mici și soluția finală este obținută prin combinarea soluțiilor subproblemelor.
 Arbori de căutare binară: Arborii de căutare binară sunt structuri de date care folosesc
principiul "Divide et Impera" pentru a stoca și căuta date. Într-un arbore de căutare
binară, fiecare nod are două subarbori: unul cu valori mai mici și unul cu valori mai mari.
Această structură permite căutarea eficientă a unei valori într-un set de date sortat prin
divizarea repetată a arborelui în jumătate și căutarea în subarborele corespunzător.

Acestea sunt doar câteva exemple de algoritmi care utilizează metoda "Divide et Impera".
Această abordare este folosită într-o varietate de algoritmi și probleme, în special în cazul în care
problema poate fi împărțită în subprobleme mai mici și soluțiile lor pot fi combinate într-o
soluție finală.

XLI. Operaţii cu structuri dinamice de date (liste, arbori)

Operațiile cu structuri dinamice de date, cum ar fi liste și arbori, sunt esențiale în dezvoltarea
aplicațiilor și algoritmilor. Iată câteva operații comune cu aceste structuri:

1. Liste:
 Inserare: Adăugarea unui element nou în listă la o anumită poziție sau la sfârșitul listei.
 Ștergere: Eliminarea unui element din listă de la o anumită poziție sau după o anumită
valoare.
 Accesare: Obținerea valorii unui element din listă la o anumită poziție.
 Căutare: Găsirea unei anumite valori în listă și returnarea poziției sau indicarea că
valoarea nu a fost găsită.
 Parcurgere: Parcurgerea listei pentru a accesa și procesa fiecare element.
 Concatenare: Unirea a două liste într-o singură listă.
2. Arbori:
 Inserare: Adăugarea unui nou nod în arbore, respectând regulile de ordine și structură
specifice arborelui.
 Ștergere: Eliminarea unui nod din arbore, respectând regulile de ordine și structură
specifice arborelui.
 Căutare: Găsirea unui anumit nod în arbore, bazat pe o anumită cheie sau valoare.
 Parcurgere: Parcurgerea arborelui pentru a accesa și procesa fiecare nod într-o anumită
ordine (pre-ordine, în-ordine, post-ordine).
 Căutare minim/maxim: Găsirea celui mai mic sau cel mai mare nod din arbore.
 Înălțimea arborelui: Calcularea numărului maxim de nivele sau adâncime în arbore.

Acestea sunt doar câteva dintre operațiile comune pe care le puteți efectua asupra structurilor
dinamice de date, cum ar fi liste și arbori. Este important să înțelegeți regulile și caracteristicile
specifice ale fiecărei structuri și să utilizați algoritmi corespunzători pentru a implementa și
manipula aceste structuri în codul dvs.

XLII. Aspecte fundamentale relative la SGBD: concept, obiective, funcţii, clasificare,


arhitecturi

Sistemul de gestiune a bazelor de date (SGBD) este un software specializat care permite
gestionarea și manipularea bazelor de date. Acesta joacă un rol crucial în organizarea și accesarea
eficientă a datelor, oferind o interfață pentru utilizatori și aplicații pentru a interacționa cu baza
de date. Iată câteva aspecte fundamentale legate de SGBD:
1. Conceptul de SGBD: Un SGBD este un sistem software care facilitează crearea,
manipularea și gestionarea bazelor de date. Acesta permite definirea structurii datelor,
accesul și actualizarea acestora, precum și implementarea măsurilor de securitate și
integritate pentru a asigura fiabilitatea și confidențialitatea informațiilor.
2. Obiectivele SGBD-urilor: Principalele obiective ale unui SGBD includ:
 Gestionarea datelor: SGBD-ul asigură stocarea și organizarea eficientă a datelor,
permițând accesul rapid și ușor la informațiile necesare.
 Integritatea datelor: SGBD-ul implementează reguli și restricții pentru a menține
integritatea datelor, asigurând că acestea sunt valide și coerente.
 Securitatea datelor: SGBD-ul oferă mecanisme de securitate pentru a proteja datele
împotriva accesului neautorizat și a pierderii.
 Eficiența operațiilor: SGBD-ul optimizează operațiile de interogare și actualizare
pentru a obține performanțe ridicate.
 Concurența: SGBD-ul gestionează concurența dintre utilizatori și aplicații, asigurând
accesul controlat și sincronizat la datele partajate.
3. Funcțiile SGBD-urilor: Principalele funcții ale unui SGBD includ:
 Definirea structurii datelor: SGBD-ul permite definirea schemei de bază de date,
inclusiv tabele, relații, constrângeri și tipuri de date.
 Manipularea datelor: SGBD-ul oferă operații pentru inserarea, actualizarea și
ștergerea datelor din baza de date.
 Interogarea datelor: SGBD-ul permite interogarea datelor utilizând un limbaj de
interogare precum SQL (Structured Query Language).
 Controlul accesului și securitatea: SGBD-ul gestionează drepturile de acces la date
și implementează măsuri de securitate pentru a proteja informațiile.
 Asigurarea integrității datelor: SGBD-ul aplică reguli de integritate pentru a
menține coerența și validitatea datelor.
 Restaurarea și recuperarea datelor: SGBD-ul oferă funcționalități pentru backup și
recuperarea datelor în caz de erori sau defecte hardware.
4. Clasificarea SGBD-urilor: SGBD-urile pot fi clasificate în funcție de diferite criterii, cum
ar fi:
 Modelul datelor: SGBD-urile pot fi bazate pe modele de date relaționale, ierarhice,
de rețea, obiect-orientate sau multidimensionale.
 Tipul utilizatorilor: SGBD-urile pot fi clasificate în SGBD-uri pentru utilizatori
individuali (cum ar fi SGBD-urile personale), SGBD-uri pentru întreprinderi (pentru
utilizarea în cadrul unei organizații) sau SGBD-uri de nivel înalt (pentru aplicații
complexe și scalabile).
 Locația datelor: SGBD-urile pot fi clasificate în SGBD-uri centralizate (datele sunt
stocate într-un singur loc) sau SGBD-uri distribuite (datele sunt distribuite pe mai
multe locații).
5. Arhitecturi SGBD-urilor: SGBD-urile pot utiliza diferite arhitecturi, cum ar fi:
 Arhitectura client-server: SGBD-ul este împărțit între un server central care
gestionează datele și unul sau mai mulți clienți care interacționează cu serverul pentru
a accesa și manipula datele.
 Arhitectura bazată pe fișiere: SGBD-ul utilizează fișiere pentru a stoca și gestiona
datele, fără o componentă server distinctă.
 Arhitectura peer-to-peer: SGBD-ul utilizează multiple noduri egale care cooperează
în gestionarea datelor și a operațiilor.

Acestea sunt câteva dintre aspectele fundamentale legate de SGBD-uri, cum ar fi conceptul,
obiectivele, funcțiile, clasificarea și arhitecturile. Fiecare SGBD are propriile sale caracteristici și
particularități, adaptate nevoilor specifice ale aplicațiilor și organizațiilor.
XLIII. Algebra relaţională

Algebra relațională este un limbaj formal utilizat pentru a efectua operații de interogare și
manipulare a bazelor de date relaționale. Aceasta se bazează pe teoria seturilor și oferă un set de
operații standardizate pentru a extrage, combina și transforma datele într-o bază de date
relațională. Iată câteva operații de bază ale algebrei relaționale:

 Selecție (σ): Această operație permite selectarea rândurilor care îndeplinesc o anumită
condiție dintr-o relație. Se folosește notația σ<condiție>(relație).
 Proiecție (π): Această operație permite selectarea anumitor coloane (atribute) dintr-o
relație. Se folosește notația π<coloană1, coloană2, ...>(relație).
 Unire (⋃): Această operație combină două relații care au aceeași schemă, rezultând o
nouă relație care conține toate rândurile din cele două relații. Se folosește notația R ⋃ S,
unde R și S sunt relații.
 Intersecție (⋂): Această operație returnează o relație care conține doar rândurile care
apar în ambele relații. Se folosește notația R ⋂ S, unde R și S sunt relații.
 Diferență (-): Această operație elimină dintr-o relație rândurile care apar și într-o altă
relație. Se folosește notația R - S, unde R și S sunt relații.
 Produs cartezian (×): Această operație combină fiecare rând dintr-o relație cu fiecare
rând dintr-o altă relație, rezultând o relație nouă care conține toate combinațiile posibile
de rânduri. Se folosește notația R × S, unde R și S sunt relații.

Acestea sunt doar câteva dintre operațiile de bază ale algebrei relaționale. Pe lângă acestea,
există și alte operații mai complexe, cum ar fi înmulțirea naturală, înmulțirea externă, diviziunea
și agregarea. Algebra relațională oferă o modalitate concisă și standardizată de a efectua operații
pe datele relaționale, permițând dezvoltarea interogărilor și manipularea datelor într-un mod
eficient și consistent.

XLIV. SGBD relaţionale: caracteristici, componente, arhitectură, mecanisme de optimizare

Sistemul de gestiune a bazelor de date (SGBD) relaționale este un software specializat utilizat
pentru gestionarea și manipularea bazelor de date relaționale. Acestea sunt câteva caracteristici,
componente, arhitectură și mecanisme de optimizare asociate SGBD-urilor relaționale:

Caracteristici:
 Model relațional: SGBD-urile relaționale utilizează modelul relațional pentru a organiza
datele în tabele cu rânduri și coloane. Relațiile (tabelele) sunt legate între ele prin chei
primare și chei externe, asigurând integritatea și relațiile dintre date.
 Structura și interogarea datelor: SGBD-urile relaționale permit definirea și
manipularea structurii datelor utilizând limbajul de interogare SQL (Structured Query
Language). Aceasta oferă un set de comenzi și instrucțiuni pentru a crea, modifica,
interoga și șterge datele din baza de date.
 Integritate și consistență: SGBD-urile relaționale asigură aplicarea regulilor de
integritate pentru a menține consistența datelor. Aceste reguli pot include constrângeri
referențiale, restricții de unicitate, restricții de cheie străină și altele.
 Acces concurent și securitate: SGBD-urile relaționale gestionează accesul concurent al
mai multor utilizatori și aplicații la baza de date. Ele implementează mecanisme de
control al accesului și securitate, cum ar fi autentificarea, autorizarea și auditarea pentru a
proteja datele și a preveni accesul neautorizat.

Componente:

 Motorul SGBD: Este componenta centrală care gestionează interacțiunea utilizatorului


cu baza de date. Include subcomponente precum optimizatorul de interogări, managerul
de memorie, managerul de tranzacții și motorul de execuție.
 Optimizatorul de interogări: Această componentă analizează interogările formulate de
utilizatori și selectează cea mai eficientă strategie de execuție a acestora. Are rolul de a
optimiza interogările pentru a obține performanțe ridicate și a utiliza resursele în mod
eficient.
 Managerul de memorie: Gestionează memoria utilizată pentru stocarea temporară a
datelor și a rezultatelor interogărilor în timpul execuției.
 Managerul de tranzacții: Asigură implementarea tranzacțiilor pentru a menține
consistența și integritatea datelor. Gestionează începerea, confirmarea și anularea
tranzacțiilor, precum și mecanismele de blocare și dezambiguizare.

Arhitectură:
SGBD-urile relaționale utilizează de obicei o arhitectură client-server, în care serverul de bază de
date gestionează stocarea și gestionarea datelor, în timp ce clienții interacționează cu serverul
pentru a accesa și manipula datele. Serverul include componentele menționate mai sus, în timp
ce clienții pot fi aplicații sau interfețe utilizator grafice care permit utilizatorilor să lucreze cu
baza de date.

Mecanisme de optimizare:

 Optimizarea interogărilor: SGBD-urile relaționale utilizează optimizatori de interogări


pentru a analiza și alege cea mai bună strategie de execuție a interogărilor. Aceasta
implică analiza structurii interogării, a statisticii despre date și a indecșilor disponibili
pentru a identifica planul de execuție optim.
 Indexarea: SGBD-urile relaționale utilizează indecși pentru a accelera căutările și
interogările în bazele de date. Indexarea permite accesul rapid la date, evitând scanarea
completă a tabelelor.
 Cache-ul: SGBD-urile relaționale utilizează cache-uri pentru a reține temporar datele
frecvent utilizate în memorie, ceea ce reduce timpul de acces la date și îmbunătățește
performanța.
 Partiționarea datelor: Unele SGBD-uri permit partajarea datelor în mai multe
fragmente sau partiții, distribuindu-le pe diferite discuri fizice sau servere. Acest lucru
poate duce la îmbunătățiri semnificative ale performanței și scalabilității.

Acestea sunt câteva caracteristici, componente, arhitectură și mecanisme de optimizare asociate


SGBD-urilor relaționale. Fiecare SGBD poate avea propriile sale caracteristici și funcționalități
specifice, adaptate nevoilor și cerințelor specifice ale aplicațiilor și organizațiilor.

XLV. Normalizarea bazelor de date

Normalizarea bazelor de date este un proces de proiectare al structurii bazelor de date relaționale,
care își propune să minimizeze redundanța și inconsistenta datelor. Scopul principal al
normalizării este de a organiza datele într-un mod coerent și eficient, astfel încât să fie ușor de
întreținut, modificat și interogat. Acesta ajută la evitarea anumitor probleme, cum ar fi pierderea
de informații, anomalii în actualizare și incoerență a datelor.
Normalizarea se bazează pe o serie de reguli și forme normale, care definesc anumite dependențe
și dependențe funcționale între atributele dintr-o bază de date. Cele mai comune forme normale
sunt:

1. Forma normală de 1NF: Aceasta stabilește că fiecare coloană (atribut) dintr-o tabelă
trebuie să conțină doar valori atomice și să nu permită valori multiple sau valori
compuse.

2. Forma normală de 2NF: Aceasta specifică că o tabelă trebuie să fie în 1NF și că toate
atributele non-cheie trebuie să depindă complet de cheia primară.

3. Forma normală de 3NF: Aceasta se referă la o tabelă care este în 2NF și în care toate
atributele non-cheie nu depind funcțional de alte atribute non-cheie.
Există și alte forme normale avansate, cum ar fi forma normală de BCNF (Boyce-Codd Normal
Form), forma normală de 4NF și forma normală de 5NF (normalizare înaintată).

Procesul de normalizare implică de obicei următorii pași:

1. Identificarea dependențelor funcționale între atributele din tabelă.


2. Organizarea atributelor în tabele separate pentru a elimina dependențele parțiale și
tranzitive.
3. Stabilirea cheilor primare și a cheilor străine pentru a defini relațiile între tabele.
4. Asigurarea că fiecare tabelă respectă o anumită formă normală (de exemplu, 3NF).

Este important de menționat că normalizarea nu înseamnă întotdeauna divizarea tabelelor în mai


multe tabele separate. Scopul este să se obțină un echilibru între normalizare și performanță,
astfel încât să se evite atât redundanța excesivă, cât și complexitatea excesivă a interogărilor.

Normalizarea bazelor de date este un proces continuu și iterativ în timpul dezvoltării și


întreținerii bazelor de date relaționale.

XLVI. Limbajul SQL

SQL (Structured Query Language) este un limbaj de programare specializat pentru gestionarea
bazelor de date relaționale. Acesta este utilizat pentru a crea, manipula și interoga datele într-o
bază de date relațională. SQL este un limbaj standardizat și larg utilizat în industria IT și în
domeniul bazelor de date.

Iată câteva aspecte cheie legate de limbajul SQL:

1. Tipuri de instrucțiuni SQL: SQL include mai multe tipuri de instrucțiuni pentru a
manipula și interoga datele. Câteva exemple comune includ:
 Instrucțiuni DDL (Data Definition Language): Acestea sunt utilizate pentru a
defini și a modifica structura obiectelor din baza de date, cum ar fi tabelele,
coloanele, cheile primare, cheile străine și constrângerile. Exemple de instrucțiuni
DDL includ CREATE, ALTER și DROP.
 Instrucțiuni DML (Data Manipulation Language): Acestea sunt utilizate pentru a
manipula datele propriu-zise într-o bază de date. Exemple de instrucțiuni DML includ
INSERT (pentru a adăuga date), UPDATE (pentru a modifica date) și DELETE
(pentru a șterge date).
 Instrucțiuni DQL (Data Query Language): Acestea sunt utilizate pentru a interoga
și a obține date dintr-o bază de date. Cea mai comună instrucțiune DQL este
SELECT, care permite extragerea datelor din tabele.
2. Clausule SQL: SQL include diferite clauze care pot fi utilizate în cadrul instrucțiunilor
pentru a specifica condiții, criterii de sortare, limite, agregări și altele. Câteva exemple de
clauze includ WHERE (pentru filtrarea datelor), ORDER BY (pentru sortarea datelor),
LIMIT (pentru limitarea numărului de rânduri returnate) și GROUP BY (pentru
agregarea datelor).
3. Funcții SQL: SQL include o serie de funcții predefinite care pot fi utilizate în
instrucțiuni pentru a realiza calcule, manipulări și transformări asupra datelor. Exemple
de funcții includ SUM, AVG, COUNT, MAX, MIN, CONCAT, UPPER, LOWER și
multe altele.
4. Relații între tabele: SQL permite definirea și gestionarea relațiilor între tabele utilizând
chei primare și chei străine. Aceasta permite realizarea de operații complexe precum
interogări join pentru a obține date din mai multe tabele în funcție de relațiile definite.

SQL este un limbaj puternic și flexibil pentru gestionarea bazelor de date relaționale.
Cunoașterea și înțelegerea limbajului SQL sunt esențiale pentru dezvoltarea și administrarea
eficientă a bazelor de date.

XLVII. Elementele unei baze de date Oracle

Elementele unei baze de date Oracle includ următoarele:


 Tabelul: Este o entitate fundamentală într-o bază de date Oracle și reprezintă o colecție
structurată de date organizate în rânduri și coloane. Tabelele sunt utilizate pentru a stoca
și gestiona datele într-o bază de date.
 Coloana: Este o unitate de bază într-un tabel Oracle și reprezintă un atribut specific al
unei înregistrări din tabel. Fiecare coloană are un nume și un tip de date asociat, precum
număr întreg, șir de caractere sau dată.
 Înregistrarea: Reprezintă o singură intrare într-un tabel Oracle și conține datele asociate
cu o entitate specifică. O înregistrare este reprezentată de o linie în tabel și conține valori
pentru fiecare coloană din tabel.
 Cheia primară: Este o coloană sau un set de coloane într-un tabel Oracle care identifică
în mod unic fiecare înregistrare din tabel. Cheia primară asigură integritatea datelor și
facilitează accesul rapid la datele specifice.
 Cheia externă: Este o coloană sau un set de coloane într-un tabel Oracle care stabilește o
legătură între două tabele. Cheia externă este utilizată pentru a crea relații între tabele și
pentru a asigura integritatea referențială a datelor.
 Indexul: Este o structură de date auxiliară utilizată pentru a accelera căutările și
interogările într-un tabel Oracle. Indexul poate fi creat pe o coloană sau pe mai multe
coloane și permite accesul rapid la datele specifice, reducând timpul de căutare.
 Tranzacția: Reprezintă o secvență logică de operații care trebuie efectuate într-o bază de
date Oracle. O tranzacție poate consta dintr-o sau mai multe instrucțiuni SQL și poate fi
fie confirmată (comisă), fie anulată (rulată înapoi) pentru a menține consistența și
integritatea datelor.
 Schema: Este un container logic într-o bază de date Oracle și include un set de obiecte,
cum ar fi tabele, indici, vizualizări, funcții, proceduri și privilegii asociate cu un
utilizator specific.
 Vizualizarea: Este o reprezentare virtuală a datelor dintr-unul sau mai multe tabele
Oracle. Vizualizările permit utilizatorilor să acceseze și să interogheze datele într-un mod
simplificat și se bazează pe reguli și criterii definite de utilizator.
Acestea sunt câteva dintre elementele de bază ale unei baze de date Oracle. Oracle oferă o gamă
largă de funcționalități și caracteristici avansate pentru gestionarea eficientă a bazelor de date și a
datelor.

XLVIII. Limbajul PL/SQL

PL/SQL (Procedural Language/Structured Query Language) este un limbaj de programare


procedural, extensie a limbajului SQL, utilizat în bazele de date Oracle. PL/SQL permite
dezvoltatorilor să creeze proceduri, funcții, declarații de variabile și blocuri de cod pentru a
realiza operații complexe asupra datelor în cadrul bazei de date Oracle.

Iată câteva aspecte cheie legate de limbajul PL/SQL:

1. Structura blocului PL/SQL: Un bloc PL/SQL este o unitate de bază în limbajul PL/SQL
și este compus dintr-o secțiune de declarații și o secțiune executabilă. Structura unui bloc
PL/SQL este următoarea:
DECLARE
-- Declarații de variabile și constante
BEGIN
-- Instrucțiuni executabile
EXCEPTION
-- Gestionarea excepțiilor
END;

În secțiunea DECLARE se declara variabilele și constantele utilizate în blocul PL/SQL. În


secțiunea BEGIN se includ instrucțiunile executabile, iar în secțiunea EXCEPTION se
gestionează excepțiile care pot apărea în timpul execuției blocului.

2. Proceduri și funcții: PL/SQL permite definirea și utilizarea procedurilor și funcțiilor.


Procedurile sunt blocuri PL/SQL care nu returnează o valoare, în timp ce funcțiile sunt
blocuri PL/SQL care returnează o valoare specifică. Acestea pot fi utilizate pentru a grupa
un set de instrucțiuni și a le executa ca o unitate.
3. Declarații de variabile: PL/SQL permite declararea și utilizarea de variabile în cadrul
blocurilor. Variabilele pot fi de diferite tipuri de date, cum ar fi numere întregi, șiruri de
caractere, date sau chiar tipuri de date definite de utilizator. Acestea sunt utilizate pentru a
stoca și manipula date în cadrul blocurilor PL/SQL.
4. Controlul fluxului: PL/SQL oferă construcții de control al fluxului, cum ar fi instrucțiuni
IF-THEN-ELSE, LOOP, WHILE și FOR, pentru a permite programatorilor să
realizeze logică condițională și iterații în cadrul blocurilor PL/SQL.
5. Tratarea excepțiilor: PL/SQL oferă mecanisme puternice pentru gestionarea și tratarea
excepțiilor care pot apărea în timpul execuției blocurilor. Utilizând construcțiile TRY-
CATCH-FINALLY, dezvoltatorii pot captura și trata erori sau situații excepționale în
mod controlat.
6. Interacțiunea cu baza de date: PL/SQL permite accesul și manipularea datelor în baza
de date Oracle utilizând instrucțiuni SQL. Dezvoltatorii pot executa interogări, inserări,
actualizări și ștergeri de date folosind instrucțiuni SQL în cadrul blocurilor PL/SQL.

PL/SQL este un limbaj puternic și flexibil, care oferă capacități avansate de programare
procedurală și interacțiune cu baza de date în cadrul sistemelor Oracle. Este utilizat pe scară
largă în dezvoltarea de aplicații și gestionarea bazelor de date Oracle.

XLIX. Scopul Inteligenţei Artificiale. Definiţii, abordări, aplicaţii

Scopul Inteligenței Artificiale (IA) este să dezvolte sisteme și tehnologii care să emuleze și să
reproducă abilitățile cognitive umane. IA se concentrează pe crearea de mașini inteligente și
programe de calculator capabile să învețe, să rezolve probleme, să preia decizii și să
interacționeze în mod autonom cu mediul înconjurător.

Definiții ale Inteligenței Artificiale:

 John McCarthy, unul dintre pionierii IA, a definit IA ca fiind "știința și ingineria
realizării de mașini inteligente".
 Stuart Russell și Peter Norvig au definit IA ca "artă și știință a programării
computerelor pentru a realiza acțiuni care necesită inteligență umană".

Abordări în Inteligența Artificială:


1. Abordarea simbolică (logică): Această abordare se bazează pe utilizarea limbajului
formal pentru a reprezenta și manipula cunoștințele și raționamentele. Sistemele bazate
pe reguli și programarea logică sunt exemple de abordări simbolice.

2. Abordarea conexiunistă (neuronală): Această abordare se inspiră din funcționarea


creierului uman și utilizează rețele neuronale artificiale pentru a modela și simula
procesele cognitive. Machine Learning și Deep Learning sunt exemple de abordări
conexioniste.

3. Abordarea evolutivă (algoritmi genetici): Această abordare se bazează pe principiile


selecției naturale și evoluției pentru a dezvolta algoritmi capabili să optimizeze și să
găsească soluții la probleme complexe.
Aplicații ale Inteligenței Artificiale:

1. Asistența virtuală și roboții personali: Sistemele de asistență virtuală precum Siri,


Alexa și Google Assistant utilizează IA pentru a oferi răspunsuri și asistență inteligentă
utilizatorilor. De asemenea, roboții personali pot fi folosiți în diverse domenii, cum ar fi
sănătatea sau serviciile.
2. Recunoașterea vocală și vizuală: Tehnologiile de recunoaștere vocală și vizuală permit
mașinilor să interpreteze și să înțeleagă limbajul vorbit și imaginile. Aceasta este folosită
în aplicații precum traducerea automată, recunoașterea facială sau recunoașterea de
obiecte.
3. Vehicule autonome: IA joacă un rol crucial în dezvoltarea vehiculelor autonome,
permițându-le acestora să învețe și să ia decizii în timp real pe baza informațiilor din
mediul înconjurător.
4. Medicină și diagnosticare: IA poate fi folosită în diagnosticarea și tratamentul bolilor,
analizând date medicale și oferind recomandări personalizate pentru pacienți.
5. Finanțe și comerț electronic: În domeniul financiar, IA este utilizată pentru analiza
datelor și prevenirea fraudei, iar în comerțul electronic pentru recomandări personalizate
și optimizarea experienței utilizatorilor.

Acestea sunt doar câteva exemple de aplicații ale Inteligenței Artificiale, iar domeniul său de
aplicare este în continuă expansiune, având potențialul de a aduce transformări semnificative în
diverse industrii și aspecte ale vieții cotidiene.

L. Demonstrarea automată

Demonstrarea automată, cunoscută și sub numele de demonstrare automatizată a teoremelor, este


un domeniu al inteligenței artificiale și al logicii computaționale care se ocupă de dezvoltarea de
tehnici și algoritmi pentru a verifica și demonstra automat adevărul sau falsitatea unei afirmații
logice sau matematice.

Scopul principal al demonstrației automate este de a furniza o metodă mecanică sau algoritmică
pentru a verifica corectitudinea unei afirmații și a găsi o demonstrație formală a acesteia, dacă
este posibil. Aceasta implică utilizarea unor reguli de inferență și algoritmi pentru a manipula
simbolic afirmațiile și a deduce concluziile din premize.
Demonstrarea automată are aplicații într-o serie de domenii, inclusiv:

1. Verificarea automată a teoremelor: Aceasta implică demonstrarea automată a


afirmațiilor matematice și logice într-un mod riguros și formal. Aceasta poate fi folosită
pentru a verifica corectitudinea unor demonstrații complexe sau pentru a găsi noi
demonstrații pentru teoreme deja cunoscute.
2. Verificarea proprietăților sistemelor hardware și software: Demonstrarea automată
poate fi utilizată pentru a verifica proprietăți critice ale sistemelor hardware sau software,
cum ar fi corectitudinea, siguranța și lipsa conflictelor. Aceasta poate ajuta la identificarea
și rezolvarea erorilor și vulnerabilităților în sistem.
3. Asistența în dezvoltarea de software: Demonstrarea automată poate oferi asistență
dezvoltatorilor de software în identificarea și rezolvarea problemelor de logică și coerență
în codul lor. Aceasta poate ajuta la găsirea și corectarea erorilor și la asigurarea calității și
robusteței software-ului.
4. Proiectarea circuitelor și a sistemelor electronice: Demonstrarea automată poate fi
utilizată pentru a verifica și valida proiectele de circuite electronice și a sistemelor
complexe. Aceasta poate ajuta la identificarea erorilor de proiectare, la optimizarea
performanței și la garantarea funcționării corecte a circuitelor și a sistemelor.
5. Raționamentul asistat de calculator: Demonstrarea automată poate fi utilizată pentru a
asista oamenii în raționamentul și luarea de decizii, oferind argumente și demonstrații
formale în sprijinul anumitor concluzii sau decizii.

Acestea sunt doar câteva exemple de aplicații ale demonstrării automate, iar domeniul său de
utilizare este în continuă expansiune, cu potențialul de a aduce beneficii semnificative într-o
gamă largă de domenii.

LI. Sisteme inteligente. Sisteme multiagent. Metaeuristici. Exemple


 Sisteme inteligente: Sistemele inteligente sunt sisteme informatice sau modele
computaționale care sunt proiectate să imite și să reproducă capacitățile cognitive umane,
cum ar fi învățarea, raționamentul, percepția și luarea deciziilor. Acestea utilizează tehnici
și algoritmi din domeniul inteligenței artificiale pentru a rezolva probleme complexe și a
realiza sarcini specifice într-un mod autonom și inteligent. Exemple de sisteme
inteligente includ asistenții virtuali, roboții autonomi, sistemele de recunoaștere vocală și
vizuală și sistemele de recomandare personalizată.
 Sisteme multiagent:Sistemele multiagent sunt sisteme compuse din mai mulți agenți
autonomi, care interacționează între ei și cu mediul înconjurător pentru a atinge anumite
obiective comune. Fiecare agent este capabil de a percepe mediul, de a prelucra
informații, de a lua decizii și de a acționa independent în funcție de obiectivele sale
individuale și de interacțiunea cu ceilalți agenți. Exemple de sisteme multiagent includ
sistemele de transport inteligent, roboții colaborativi și sistemele de management al
traficului.
 Metaeuristici:Metaeuristici sunt algoritmi de optimizare și căutare heuristici care sunt
folosiți pentru a rezolva probleme complexe și de optimizare într-un mod eficient. Acești
algoritmi sunt concepuți să exploreze spațiul soluțiilor și să găsească soluții bune, chiar și
în situațiile în care spațiul soluțiilor este vast și greu de explorat în mod exhaustiv.
Metaeuristicii sunt caracterizați prin capacitatea lor de a combina elemente de explorare
și exploatare pentru a obține soluții de calitate într-un timp rezonabil. Exemple de
metaeuristici includ algoritmul genetici, căutarea tabu, optimizarea prin roi de particule și
algoritmul furnicii.

Acestea sunt câteva exemple și concepte cheie legate de sistemele inteligente, sistemele
multiagent și metaeuristici. Aceste domenii sunt extrem de dinamice și se dezvoltă în continuare,
având aplicații largi și impact semnificativ într-o varietate de domenii, cum ar fi tehnologia
informației, robotică, transport, logistică, economie și multe altele.

LII. Utilizarea listelor în PROLOG. Operații fundamentale pe liste.

În PROLOG, liste sunt structuri de date fundamentale care pot fi utilizate pentru a stoca și
manipula colecții de elemente. Liste sunt definite recursiv în PROLOG și pot conține orice tip de
date, inclusiv alte liste.

Iată câteva operații fundamentale pe liste în PROLOG:

1. Crearea unei liste:


 listă goală poate fi reprezentată prin atomul "[]".
 listă cu elemente poate fi construită utilizând operatorul "|" (cunoscut și sub numele
de operator cons), care adaugă un element la începutul unei liste existente. De
exemplu, [X | RestulListei] va construi o listă cu elementul X la început și restul
elementelor în RestulListei.
2. Verificarea dacă o listă este goală:
 Utilizați unificarea cu lista goală pentru a verifica dacă o listă este goală. De exemplu,
Lista = [] va fi adevărată numai dacă Lista este o listă goală.
3. Adăugarea unui element la sfârșitul unei liste:
 Utilizați recursivitatea și operatorul "|" pentru a adăuga un element la sfârșitul unei
liste. De exemplu, append(Lista, [Element], NouaLista) va construi NouaLista prin
adăugarea elementului Element la sfârșitul listei Lista.
4. Concatenarea a două liste:
 Utilizați predicatul predefinit append(Lista1, Lista2, ListaConcatenata) pentru a
concatena două liste. Aceasta va construi ListaConcatenata prin atașarea listei Lista2
la sfârșitul listei Lista1.
5. Obținerea capului și cozii unei liste:
 Utilizați operatorii "|" și "=" pentru a obține primul element (capul) și restul
elementelor (coada) unei liste. De exemplu, [Cap | Coada] = Lista va lega Cap la
primul element al listei Lista și Coada la restul elementelor.

Acestea sunt doar câteva exemple de operații fundamentale pe liste în PROLOG. Lista este o
structură de date puternică în PROLOG, iar există și alte predicate predefinite și personalizate pe
care le puteți utiliza pentru a manipula și a accesa elementele listelor în funcție de nevoile dvs.

LIII. Problema sortării. Algoritmi de sortare.

Problema sortării constă în aranjarea unui set de elemente într-o anumită ordine. Există o serie de
algoritmi de sortare care pot rezolva această problemă, fiecare având avantaje și dezavantaje în
funcție de specificul situației și de setul de date. Iată câteva exemple de algoritmi de sortare:

1. Sortare prin inserție (Insertion Sort): Acest algoritm sortează elementele prin
construirea în mod iterativ a unei liste sortate, la început golă, și inserarea fiecărui
element în poziția potrivită. Complexitatea medie este O(n^2), ceea ce face ca acest
algoritm să fie eficient pentru seturi mici de date.

2. Sortare prin selecție (Selection Sort): Acest algoritm sortează elementele prin
selectarea repetată a celui mai mic element și plasarea lui la începutul listei.
Complexitatea medie este O(n^2), iar principala sa dezavantaj este că nu este stabil.

3. Sortare prin interschimbare (Bubble Sort): Acest algoritm sortează elementele prin
compararea și interschimbarea repetată a elementelor adiacente într-o listă, până când
lista este sortată. Complexitatea medie este O(n^2), iar acesta poate fi ineficient pentru
seturi mari de date.

4.
5. Sortare prin împărțire (Merge Sort): Acest algoritm folosește metoda divide et impera
pentru a sorta elementele. Listele sunt divizate în mod recursiv în jumătăți până când
rămân listele de un singur element, apoi sunt combinate în mod recursiv într-o singură
listă sortată. Complexitatea medie este O(n log n), ceea ce face ca acest algoritm să fie
eficient pentru seturi mari de date.

6. Sortare rapidă (Quick Sort): Acest algoritm folosește, de asemenea, metoda divide et
impera, dar în loc să divizeze listele în jumătăți egale, folosește un element pivot pentru a
împărți lista în două subliste. Complexitatea medie este O(n log n), iar acesta este unul
dintre cei mai rapizi algoritmi de sortare, cu avantajul de a fi eficient și în cazul seturilor
de date mari.
Acestea sunt doar câteva exemple de algoritmi de sortare, existând și alte algoritmi precum Heap
Sort, Shell Sort, Counting Sort și altele. Alegerea algoritmului de sortare potrivit depinde de
particularitățile setului de date și de criteriile de performanță dorite, cum ar fi complexitatea
temporală, stabilitatea și necesitatea de spațiu suplimentar.

LIV. Procesarea unui arbore în PROLOG.


Prolog este un limbaj de programare logic care se bazează pe conceptul de reguli și fapte.
Procesarea unui arbore în Prolog implică utilizarea regulilor și a faptelor pentru a analiza și a
manipula structurile arborescente.

Iată un exemplu simplu pentru procesarea unui arbore în Prolog:

1. Definirea arborelui: Arborele poate fi definit ca o structură compusă din noduri și


muchii. În Prolog, puteți folosi faptele pentru a defini nodurile și relațiile dintre ele. De
exemplu, putem defini un arbore binar în felul următor:

% Fapte reprezentând un arbore binar

nod(a).

nod(b).

nod(c).

nod(d).

nod(e).

nod(f).

muchie(a, b).

muchie(a, c).

muchie(b, d).

muchie(b, e).

muchie(c, f).

2. Procesarea arborelui: Utilizați reguli pentru a procesa și a explora arborele. Puteți defini
reguli recursive pentru a parcurge arborele în adâncime (depth-first) sau în lățime
(breadth-first). De exemplu, putem defini o regulă pentru a parcurge arborele în
adâncime și pentru a afișa fiecare nod:

% Regulă pentru parcurgerea arborelui în adâncime și afișarea nodurilor

parcurgere_adancime(Nod) :-
nod(Nod), % Verificăm dacă Nodul este în faptele definite

write(Nod), nl, % Afișăm Nodul

muchie(Nod, Copil), % Găsim copiii Nodului

parcurgere_adancime(Copil). % Apelăm recursiv parcurgerea pentru fiecare copil

3. Testarea procesării arborelui: Pentru a testa procesarea arborelui, puteți rula interogări
în Prolog. De exemplu, pentru a parcurge arborele în adâncime și a afișa nodurile, puteți
rula următoarea interogare:

?- parcurgere_adancime(a).

Aceasta va afișa rezultatul parcurgerii arborelui în adâncime, începând de la nodul "a".

Acesta este doar un exemplu simplu de procesare a unui arbore în Prolog. Puteți extinde această
abordare și utiliza reguli și fapte suplimentare pentru a realiza diverse operații și manipulări pe
structurile arborescente în Prolog.

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