You are on page 1of 24

CUPRINS

Operatori la nivel de bit ......................................................................................................2


Operatori logici pe biti &, ^, |..........................................................................................2
Operatorul de complementare ~......................................................................................2
Operatori de deplasare la nivel de bit <<, >>..................................................................2
Precedenţa operatorilor....................................................................................................4
Variabile de tip cookie ........................................................................................................5
Crearea unei variabile cookie..........................................................................................6
Accesul la o variabila cookie...........................................................................................7
Variabile de tip tablou asociativ......................................................................................7
Sesiuni in PHP ....................................................................................................................9
Definitie...........................................................................................................................9
Declararea sesiunii...........................................................................................................9
Valori implicite..............................................................................................................10
Identificatori..................................................................................................................10
Diferenta dintre sesiunile cu cookies si sesiunile fara cookies:.....................................11
Utilizarea variabilelor in functii ........................................................................................11
Variabile globale............................................................................................................12
Functii pentru determinarea tipului variabilei...............................................................13
Algoritmi ...........................................................................................................................15
Algoritmi de sortare.......................................................................................................15
Varianta 1 – Bubble Sort (Interschimbare)....................................................................15
Varianta 2 – Selectie......................................................................................................16
Varianta 3 - Insertie.......................................................................................................17
Varianta 4.......................................................................................................................17
Recursivitate .....................................................................................................................18
Aplicatii recursive..........................................................................................................19
Suma cifrelor............................................................................................................19
Trecerea din baza 10 intr-o baza mai mica........................................................19
Calculul celui mai mare divizor comun................................................................19
Combinatorica recursiva................................................................................................20
Aranjamente.............................................................................................................20
Combinari.................................................................................................................21
Permutari..................................................................................................................22
Teme .................................................................................................................................22
Tema 1...........................................................................................................................22
Tema 2...........................................................................................................................23
Tema 3...........................................................................................................................23
Tema 4...........................................................................................................................23
Tema 5...........................................................................................................................23

1
Operatori la nivel de bit
In plus fata de operatorii prezentati in modulul 1, exista operatorii la nivel de bit.
Operatorii la nivel de bit se aplica fiecarui bit din reprezentarea operanzilor
intregi, spre deosebire de restul operatorilor care se aplica valorilor operanzilor.
Din aceasta categorie fac parte urmatorii operatori:
- conjuncţie ('&') - SI (AND);
- disjuncţie ('|') - SAU (OR);
- disjuncţie exclusivă ('^') - SAU exclusiv (XOR);
- complementare ('~') - NU (NOT);
- deplasare la stânga ('<<');
- deplasare la dreapta ('>>')

Operatori logici pe biti &, ^, |

Realizeaza operatiile si, sau exclusiv, respectiv sau intre toate perechile de biti
corespunzatori ai operanzilor. Daca b1 si b2 reprezinta o astfel de pereche, tabelul
urmator prezinta valorile obtinute prin aplicarea operatorilor &, ^, |.
 
a b a&b a^b a|b
00000000 00000001 00000000 00000001 00000001
11111111 10101010 10101010 01010101 11111111

Operatorul de complementare ~

a b ~a ~b
00000000 00000001 11111111 11111110
11111111 10101010 00000000 01010101

Operatori de deplasare la nivel de bit <<, >>

Acest tip de operatori folosesc doi operanzi. Operandul din stanga este un numar
intreg ai carui biti trebuie deplasati. Operandul din dreapta este numarul de biti cu care
trebuie deplasata reprezentarea binara a numarului intreg.

2
In continuare vom expune acesti operatori impreuna cu cate un exemplu de
folosire:
Operatorul de deplasare spre stanga intoarce valoarea unui numar intreg daca bitii sai au fost
deplasati cu un numar de locuri spre stanga. Totii bitii vacanti din dreapta sunt completati cu
zerouri.
In practica deplasarea spre stanga a unui numar intreg pozitiv echivaleaza cu dublarea valorii
<<
sale de un numar de ori corespunzator numarului de biti deplasati. Aceasta operatie este
executata de calculatoare mai rapid decat inmultirea explicita cu 2.
Exemplu:
15<<1  --> intoarce 30 ( 1111<<1 intoarce 11110 )
Operatorul de deplasare spre dreapta intoarce valoarea unui numar intreg daca bitii sai au fost
deplasati cu un numar de locuri spre dreapta. Toti bitii vacanti sunt completati cu copia bitului
cel mai din stanga (bitul de semn). Copierea bitului cel mai din stanga asigura ca numarul
intreg va ramane fie pozitiv fie negativ. Aceasta este de asemenea o modalitate de a imparti
>>
un numar intreg pozitiv par de un numar de ori la 2. In cazul unui numar intreg pozitiv impar
efectul este de impartire la 2 si ignorarea restului .
Exemplu:
15>>1 intoarce 7 ( 1111>>1 intoarce 0111 )

Pentru operatorii de deplasare, daca al doilea operand are valoarea mai mare
decat numarul de biti folositi pentru reprezentarea numerelor intregi, atunci numarul
pozitiilor cu care sunt deplasati bitii primului operand va fi dat de restul împartirii valorii
celui de-al doilea operand la numãrul bitilor folositi pentru reprezentare. Daca valoarea
celui de-al doilea operand este negativa, atunci numarul de pozitii va fi dat de restul
impartirii valorii celui de-al doilea operand la numarul bitilor folositi pentru reprezentare
la care se aduna numarul bitilor folositi pentru reprezentare.

expresia $a << 36 este echivalentã cu


expresia $a << 4 deoarece 36%32=4;

expresia $a << -52 este echivalenta cu


expresia $a << 12, deoarece -52%32+32=-20+32=12.

Daca nu au loc depasiri de reprezentare, o deplasare la stânga cu p pozitii este


echivalenta cu o înmultire cu valoarea 2p, iar o deplasare la dreapta cu p pozitii este
echivalenta cu o impartire intreaga la valoarea 2p.
Daca un operand asupra caruia actioneazã un operator pe biti este numar real,
acesta este convertit la o valoare întreaga

3
Precedenţa operatorilor

Precedenţa operatorilor specifică ordinea în care se aplică operatorii. De exemplu,


în expresia 1 + 5 * 3 rezultatul este 16 şi nu 18, căci înmulţirea ('*') are prioritate
superioară în raport cu adunarea ('+').
Tabelul următor conţine operatorii disponibili în PHP în ordinea crescătoare a
priorităţilor.
Asociativitate Operatori
Stânga ,
Stânga or
Stânga xor
Stânga ŞI
Dreapta print
Stânga =, +=, -=, *=, /=, .=, %=, &=, |=, ^=, ~=, <<=, >>=
Stânga ?:
Stânga ||
Stânga &&
Stânga |
Stânga ^
Stânga &
Non-asociativ ==, !=, ===, !==
Non-asociativ <, <=, >, >=

4
Stânga <<, >>
Stânga +-
Stânga */, %
Stânga !, ~, ++, --, (int), (double), (string), (array), (obiect), @
Stânga [
Non-asociativ new

 Exemplu :
 Consideram expresia    $a + $b * $c
 Precedenţa operatorului de multiplicare * este mai ridicată decât aceea a
operatorului de adunare +, deci înmulţirea este efectuată prima, chiar dacă adunarea apare
la stânga înmulţirii. Cu alte cuvinte, expresia este evaluată ca şi cum ar fi fost scrisă
astfel:
$a + ( $b * $c )
Dacă doriţi ca adunarea să fie efectuată prima, puteţi folosi paranteze în cadrul
expresiei, astfel:
( $a + $b ) * $c

Variabile de tip cookie


Variabilele cookie sunt utile pentru stocarea preferintelor utilizatorilor si a altor
informatii care trebuie retinute atunci cand utilizatorul trece la o noua pagina Web.
Valorile majoritatii variabilelor dispar atunci cand scriptul PHP care la contine isi incheie
executia. Spre deosebire de acestea, valorile variabilelor cookie se pot pastra un timp
indefinit. Pentru ca valorile lor sa se poata pastra, browserul utilizatorului stocheaza;
variabilele cookie in unitatea de hard-disc locala a utilizatorului.
Variabilele cookie sunt utile dintr-o multime de puncte de vedere. De exemplu,
multe situri Web folosesc variabile cookie pentru a stoca identitatea utilizatorului so
preferintele de vizualizare ale acestuia. Cand utilizatorul revine la situl Web, variabilele
cookie permit site-ului sa recunoasca utilizatorului si sa restaureze optiunile selectate de
catre utilizatori.
Din pacate, variabilele cookie nu constituie solutia perfecta pentru un mediu de
stocare pe termen lung si prezinta o serie de dezavantaje. De exemplu:
Un utilizator poate dezactiva variabilele cookie prin stabilirea unei optiuni a
browserului in anumite situatii, variabilele cookie pot fi vizualizate de alti utilizatori
decat utilizatorul ale carui date le stocheaza
Un site poate stoca numai 20 de variabile cookie si numai 4KB de informatii in
unitatea de hard-disc locala a utilizatorului
Numeroase versiuni ale browserelor frecvent folosite au erori care le impiedica sa
foloseasca variabilele cookie in mod adecvat

5
In ciuda acestor dezavantaje, variabilele cookie raman cea mai popularea tehnica
pentru obtinerea unui mediu de stocare pe termen lung

Crearea unei variabile cookie

Crearea unei variabile cookie este aproape la fel de simpla ca si obtinerea


accesului la aceasta. Pentru a crea o variabila cookie se va invoca functia setcookie(),
care are urmatoarea forma: setcookie(nume, valoare, expirare)
 nume – specifica numele variabilei cookie
 valoare –specifica valoarea variabilei
 expirare – indica momentul expirarii variabilei cookie (dupa ora
specificata, variabila cookie nu mai este accesibila)
In general, este convenabil si se specifice momentul expirarii folosind functia
time(), care returneaza intervalul de timp (exprimat in secunde) scurs de la 1 ianuarie
1970. Puteti adauga o valoare de tip decalaj (offset) care specifica, intervalul de timp pe
durata caruia variabila cookie trebuie sa fie accesibila. De exemplu sa luam in
considerare urmatoarea instructiune:

setcookie(varsta,20, time()+3600);

Aceasta instructiune creeaza o variabila cookie denumita varsta care are valoarea
20. Variabila cookie va fi disponibila timp de o ora (3600 secunde) de la crearea sa.
Putem specifica momentul expirarii si folosind functia mktine(). Aceasta functie
are urmatoarea forma: mktime(ore, minute, secunde, luna,zi, an)
De exemplu urmatoarea instructiune creaza o variabila cookie care expira la o
secunda dupa miezul noptii primei zile a anului 2009.

setcookie (varsta,20,mktime(0,0,1,1,1,2008));

Valorile variabilelor cookie sunt trimise de catre browser ca parte a antetelor


HTTP.
Valorile variabilelor cookie trebuie sa fie stabilite anterior expedierii oricaror altor
valori catre browser. Trimiterea fie si a unui singur spatiu va poate impiedica sa
configurati valoarea unei variabile cookie. Pentru a evita problemele asigurati-va ca un
script PHP care stabileste o valoare a unei variabile cookie este plasat in partea superioara
a fisierului fara caractere de tip spatiu care sa-l preceada. De asemenea, stabiliti valoarea
variabilei cookie inainte de a executa o instructiune echo sau o alta instructiune PHP care
trimite browserului date de iesire.
Functia setcookie() trebuie scrisa inaintea oricarui marcator HTML (inainte de
<html>) pentru ca antetul Set-Cookie sa fie primul trimis clientului.
Functia setcookie() poate prelua maximum 6 argumente. Formatul complet al
functiei setcookie(): setcookie(nume,valoare,expirare,cale,domeniu,sigur).

Argumentele nume,valoare si expirare au fost deja descrise.


 cale – permite sa specificam calea URL asociata variabilei cookie. In mod
prestabilit, variabila cookie este disponibila pentru scripturile din

6
directorul care contine scriptul in care a fost configurata variabila
respectiva, precum si pentru scripturile din sub-directoarele aferente. In
particular, scriptu-rilor din directoarele parinte ale directorului care
contine scriptul nu li se permite accesul prestabilit la variabila cookie.
 domeniu – se refera la domeniul Internet al site-ului
 sigur – poate avea valoarea 1 sau 0 si se refera daca cookieul va fi trimis
doar peste o conexiune sigura (HTTPS). Implicit este 0.

Exemplu:
setcookie(“TestCookie”,somecontent,time()+3600,”/~raspuns/”,”.example.com”,1);

Accesul la o variabila cookie

Poate ca trasatura cea mai caracteristica a variabilelor cookie o constituie


comoditatea. Daca ati creat o variabila cookie valoarea acesteia este automat pusa la
dispozitie ca variabila PHP avand acelasi nume cu acela al variabilei cookie. De exemplu,
sa presupunem ca ati creat o variabila cookie denumita varsta si ca ii atribui valoarea 20.
Aceasta pereche nume-valoare este apoi pusa la dispozitie fiecarui script PHP ascociat
sitului dvs de Web. Deci puteti afisa valoarea variabilei cookie fololsind urmatoarea
instructiune:

echo “Valoarea variabilei cookie este “.$_COOKIE[“varsta”];

Aceasta instructiune are ca efect afisarea urmatorului rezultat:


Valoarea variabilei cookie este 20

Variabile de tip tablou asociativ

Variabilele PHP de tip tablou asociaiv $HTTP_COOKIE_VARS si $_COOKIE


contin numele si alocarea fiecarei variabile cookie curenta. Daca doriti sa obtineti accesul
la toablou prin metode programatice, puteti folosi un program ca urmatorul:

foreach($HTTP_COOKIE_VARS as $nume=> $valoare)


echo <BR>$nume=> $valoare;

7
Exemplu:

Ex1.html
<HTML>
<HEAD>
<TITLE>Exemplu pentru variabile de tip cookie</TITLE>
</HEAD>
<BODY>
<FORM METHOD="POST" ACTION="ex1.php">
<H2>Autentificare</H2>
<BR><BR>
Numele utilizatorului:
<BR><INPUT TYPE="USSER" NAME="nume_utilizator">
<BR><BR>
Parola
<BR><INPUT TYPE="PASSWORD" NAME="parola">
<BR><BR><BR><BR>
<INPUT TYPE="SUBMIT" VALUE="Trimite">
</FORM>
</BODY>
</HTML>

Ex1.php
<?
$nume_utilizator=$_POST["nume_utilizator"];
$parola=$_POST["parola"];
$parole = array(
"mihai" =>"portocala",
"stefan"=>"cartof",
"andrei" =>"arahida"
);
if ($parola == $parole[$nume_utilizator])
{
setcookie("nume_utilizator", $nume_utilizator, time()+120);
echo "<H2>Accesul este permis.</H2>";
}
else
{
setcookie("nume_utilizator", "", time()-3600);
echo "<H2>Nume de utilizator sau parola incorecte: accesul interzis.</H2>";
}
echo $_COOKIE["nume_utilizator"];
?>

8
Ruland programul fara linia rosie, variabila cookie nume_utilizator, se formeaza
in conditiile in care am introdus numele si parola corecta, la prima rulare a scriptului. La
a doua rulare (facuta pana in 120 secunde) chiar daca introduc userul gresit, apare
mesajul de eroare corespunzator, insa se pastreaza variabila cookie formata anterior si se
afiseaza la final corect.
Acest aspect nu este in regula si de aceea se introduce in program, pe latura else a
if-ului, linia de cod rosie (functia setcookie), care sterge variabila cookie (seteaza
variabila cookie nume_utilizator cu o valoare nula si o durata de viata negativa).

Sesiuni in PHP
In mod normal, o variabila locala declarata intr-o pagina *.php este valabila doar
in acea pagina, daca nu intervenim intr-un fel pentru a o transfera si pe alte pagini unde
avem nevoie de ea.

Modalitatile de pastrare a informatiilor pe tot parcursul aplicatiei sunt:


-          variabile globale
-          sesiuni
-          cookies
-          transferul variabilelor locale prin forme sau in header-ul unei alte pagini

Definitie
 
O sesiune reprezinta una din caile de a pastra datele de lucru ale unei aplicatii
atunci cand se face transferul de la o pagina la alta.
 PHP foloseste in mod nativ sesiuni, asa cum fac si limbajele ASP si ColdFusion.
Lucrul cu sesiuni nu este complicat.

Declararea sesiunii

Fiecare sesiune trebuie declarata la inceputul paginii, cu ajutorul functiei:


start_session();
Aceasta functie face ca PHP sa inregistreze un identificator unic al sesiunii (ID),
iar acel identificator este trimis utilizatorului printr-un cookie. Totodata, pe server se
creaza un fisier care va retine valorile variabilelor folosite in aceasta sesiune. Fisierul are
numele la fel cu identificatorul ID al sesiunii.
 Apoi trebuie declarata variabila (sau variabilele) cu care lucram in cadrul acestei
sesiuni. Pot fi create oricate variabile.
session_register('sesiunea_mea');
 Variabila $sesiunea_mea poate fi o variabila simpla sau un tablou (array).
Exemplu:
$sesiunea_mea = “Gigel”;     // variabila simpla
sau

9
$sesiunea_mea[“id”] = 1; // cazul unui array
$sesiunea_mea[“nume_utilizator”] = “Gigel”;
$sesiunea_mea[“adresa”] = “Bucuresti”; // etc.
 Variabilele definite in acest mod pot fi folosite pe toate paginile unei aplicatii,
definite pe un domeniu dat, atat timp cat cookie alocat acelei sesiuni este activ (nu
expira). Folosirea sesiunilor este o cale mult mai usoara de lucru decat sa transferam
variabilele de la pagina la pagina.

Exemplu:
 <?
session_start();
session_register(“prima_variabila”);
$prima_variabila = “Modulul 2 PHP”;
?>
 
$prima_variabila va putea fi folosita apoi pe toate paginile aplicatiei respective.

Variabilele definite in sesiuni pot fi folosite intr-o pagina doar dupa ce a fost
executata comada session_start();
Aceasta comanda ii spune PHP-ului sa verifice daca exista o sesiune si atunci sa
foloseasca variabilele acelei sesiuni ca variabile globale.
 Functiile session_start(), ca si setcookie()  trebuie folosite intotdeauna chiar la
inceputul fisierului. Daca se trimite altceva catre browser inainte de folosirea lor atunci
vor exista erori la folosirea sesiunii sau a cookie-urilor.

Valori implicite

 In php.ini pot fi setate diferite valori pentru parametri legati de sesiune cum ar fi
(dupa semnul egal am pus valorile implicite) :
session.cookie_path = “/”;
session.cookie_domain = “”;
session.cookie_lifetime = “0”; // valoarea 0 inseamna ca cookie pentru sesiune e
valabila pana cand browserul se va inchide.
session.name = “PHPSESSID”;
si altele.

Identificatori

 Exista posibilitatea ca un utilizator sa nu accepte setarea de cookies pe


computerul sau. In acest caz, pentru identificarea unei sesiuni se poate folosi
identificatorul acesteia. Putem adauga acest identificator in stringul care apleaza o
pagina:
 <a href = “exemplu.php?<?=$ID?”>Link catre exemplu</a>
<?= este un mod mai scurt de a scrie comanda echo. <?= se poate folosi cu orice
variabila, nu doar cu sesiuni.

10
 Un identificator PHPSESSID arata ca o insirurire aleatoare de caractere
alfanumerice:
PHPSESSID = 02993ab99sac988da9753330af72201
 Daca PHP este compilat cu optiunea enable-trans-id, atunci identificatorul
sesiunii este adaugat automat la fiecare pagina.
  

Diferenta dintre sesiunile cu cookies si sesiunile fara cookies:

Daca folosim cookies putem reveni pe site fara sa pierdem datele respective, daca
nu a expirat timpul de viata al cookie. Daca folosim sesiuni, nu avem acest avantaj.
Problema este ca anumite persoane isi dezactiveaza cookies deoarece cred ca pot
primi virusi prin intermediul lor, ceea ce pana acum nu s-a dovedit.
Mai exista o problema, daca implementam ambele versiuni, cu si fara cookies, in
functie de browser-ul folosit de user, atunci cand sunt dezactivate in browser cookies si
folosim sesiunile normale, PHP-ul pune automat un camp aditional (session ID-ul =
identificatorul de sesiune) in orice FORM din pagina noastra HTML. Acest camp este
plasat chiar la inceput, pe primul 'loc'. Daca aveti un formular ce contine cod javascript
de genul document.myform.elements[i] pentru user-ul care foloseste cookies, primul
element va fi cel intentionat, daca nu foloseste cookies, insa, va fi acest 'session ID’.
Pentru a activa/dezactiva cookies, in fisierul php.ini, se foloseste:
session.use_cookies = 1
respectiv
session.use_cookies = 0

session.gc_probability = 1
Probabilitatea (exprimata in procentaj) ca la urmatoarea folosire a unei sesiuni, sa
se verifice si eventual sa se stearga (invalideze) o sesiune, este de 1%.
Puneti aici 100 si la orice folosire a mecanismului de sesiuni se verifica si se sterg
cele care nu mai sunt valabile (nerecomandabil in sistemele reale cu acces foarte des,
incarca foarte mult serverul cu actiuni nenecesare)

Utilizarea variabilelor in functii


Domeniul de vizibilitate al variabilelor: orice variabila folosita in interiorul unei functii
este vizibila doar in interiorul functiei.

Exemplu: deoarece functia foloseste o variabila declarata in afara ei echo nu va afisa


nimic

<?php
$a=10;
function test() {

11
echo "valoarea lui a este ".$a;
}
test();
?>
Variabile globale
Exemplu: aceeasi functie dar acum declaram variabila de tip global motiv pentru
care echo va afisa corect
<?php
$a=10;
function test() {
global $a; //declaram variabila $a de tip global
echo "valoarea lui a este ".$a;
}
test();
?>

Exemplu: se lucreaza cu doua functii si doua variabile. Functia a doua se apeleaza


in prima inainte de a fi definita. Cele 2 functii apeleaza variabile declarate global
<?php
$a=10;$b=5;
function test1()
{
global $a;
global $b;
echo $b;
echo $a;
test2();
}

function test2()
{
global $a;
global $b;
echo $b;
echo $a;
}

test1();

?>

Variabile statice

12
O alta caracteristica importanta a scopului variabilei este variabila statica care
exista doar in interiorul functiei locale dar isi pierde valoarea cand executia scriptului
inceteaza.

Exemplu: executarea succesiva a functiei va afisa tot timpul zero ( 0 )


<?php
function static1() {
$a=0;
echo $a;
$a++;
}
static1();
echo "<br>";
static1();
echo "<br>";
static1();
?>

Exemplu: aceeasi functie dar declaram variabila ca fiind statica. De cate ori
functia va fi executata ea va incrementa valoarea anterioara a variabilei $a
<?php
function static1() {
static $a=0;
echo $a;
$a++;
}
static1();
echo "<br>";
static1();
echo "<br>";
static1();
?>
Variabile variabile

Cateodata este util sa avem nume variabil pentru variabila


Exemplu:
<?php
$a="Buna";
$$a="Ziua";
echo "$a $Buna";
?>

Functii pentru determinarea tipului variabilei.

13
Exemplu: verificam daca variabila $a este de tip intreg
<?php
$a=19;
if (is_integer($a))
{
echo '$a este intreg';
}
else
{
echo '$a nu este intreg';
}
?>

Exemplu: verificam daca variabila $a este de tip numar cu virgula flotanta


<?php
$a=3.14;
if (is_float($a))
{
echo '$a este numar cu virgula flotanta';
}
else
{
echo '$a nu este numar cu virgula flotanta';
}
?>

Exemplu: verificam daca variabila $a este de tip sir


<?php
$a="sir";
if (is_string($a))
{
echo '$a este un sir';
}
else
{
echo '$a nu este un sir';
}
?>

Exemplu: verificam daca variabila $a este o matrice


<?php
$a = array('fructe','legume','carne');
if (is_array($a))
{
echo '$a este o matrice';
}

14
else {
echo '$a nu este o matrice';
}
?>

Algoritmi
Algoritmi de sortare

Cele mai folosite tipuri de date in cadrul algoritmilor de sortare sunt tipul de ordin
numeric si tipul lexicografic. Eficienta acestor algoritmi este importanta deoarece se pune
un mare accent pe optimizarea altora (cum sunt algoritmii de cautare) care necesitta
sortarea tablourilor cu care lucreaza, devenind astfel mai eficienti; si se foloseste adesea
pentru fixarea datelor catre un rezultat care mai este denumit si iesire. Printr-o iesire se
intelege rezultatul sortarii. Mult mai formal, iesirea trebuie sa indeplineasca doua
conditii:
Conditia 1: Iesirea trebuie sa contina un tablou (sau lista) in care valorile
termenilor sa fie aranjate in ordine crescatoare.Fiecare element al tabloului nu trebuie sa
fie mai mic decat termenul de dinaintea lui, aceasta conditie fiind valabila pentru toti
termenii din tablou.
Conditia 2: Iesirea este o permutare, sau o reordonare a datelor de la intrare
(datele care nu sunt sortate).Prin date de intrare intelegandu-se valorile termenilor
prezenti in tabloul care trebuie sa fie sortat.

Varianta 1 – Bubble Sort (Interschimbare)

Acest algoritm de sortare functioneaza pe o metoda directa si simpla de sortare a


datelor care sunt utilizate in domeniul calculatoarelor. Algoritmul incepe procedeul de
sortarea prin aranjarea termenilor din tabloul ce trebuie sortat. Astfel ca se vor compara
primii doi termeni, iar daca s-a constatat ca valoarea numerica a primului termen este mai
mare ca valoarea numerica a celui de-al doilea termen va avea loc o interschimbare de
pozitii: primul termen va trece pe pozitia pe care se afla al doilea termen in cadrul
tabloului ce trebuie sortat (prin intermediul unei variabile auxiliare)
Se procedeaza asa si cu restul perechilor de numere din tablou, pana nu mai exista
nici o pereche de numere necomparata. Acum algoritmul reia compararea perechilor de
numere din tabloul si cicleaza astfel pana cand nu mai exista nici o neconcordanta intre
valorile termenilor din tablou fata de ultima parcurgere. Daca "bubble-ul" se utilizeaza la
sortarea unui numar mic de termeni (de exemplu 20) el se comporta mult mai eficient in
comparatie cu algoritmul de sortare cel mai rapid "quick sort".

Exemplu:
<?php
function sortare($v=array(),$n)
{

15
do
{
$k=0;
for($i=0;$i<$n-1;$i++)
if($v[$i]>$v[$i+1])
{
$k=1;
$t=$v[$i];
$v[$i]=$v[$i+1];
$v[$i+1]=$t;
}
}
while($k==1);
return $v;
}

$n=6;
$x=array(7,5,3,8,6,9);
$z=sortare($x,$n);
for($i=0; $i<$n; $i++)
echo $z[$i];
?>

Varianta 2 – Selectie

Acest tip de sortare se comporta eficient daca lucreaza cu liste mari de date.
Mod de functionare: se considera subtabloul a[i],...,a[n], se cauta elementul minim
din acest subtablou si apoi se interschimba acest element cu elementul a[i], repetindu-se
procedeul pentru valori ale lui i de la 1 la n-1.

<?php
function sortare($v=array(),$n)
{
for($i=0;$i<$n-1;$i++)
{
$min=$v[$i];
$k=$i;
for($j=$i+1; $j<$n; $j++)
if($v[$j]<$min)
{
$min=$v[$j];
$k=$j;
}
$t=$v[$k];
$v[$k]=$v[$i];

16
$v[$i]=$t;
}
return $v;
}

$n=6;
$x=array(7,5,3,8,6,9);
$z=sortare($x,$n);
for($i=0; $i<$n; $i++)
echo $z[$i];
?>

Varianta 3 - Insertie

Acest tip de algoritm simplu de sortare si se comporta eficient in lucrul cu tablouri


de date de dimensiuni mici sau in cadrul tablourilor sortate partial
El procedeaza prin aducerea termenilor (elementelor) din tabloul unul cate unul si
inserarea lor in pozitia corecta intr-un nou tablou.

<?php
function sortare($v=array(),$n)
{
$s[0]=$v[0];
for($i=1;$i<$n;$i++)
{
$j=$i-1;
while($j>=0 && $v[$i]<$s[$j]) $j--;
for($k=$i-1; $k>=$j+1; $k--)
$s[$k+1]=$s[$k];
$s[$j+1]=$v[$i];
}
return $s;
}

$n=6;
$x=array(7,10,3,8,6,9);
$z=sortare($x,$n);
for($i=0; $i<$n; $i++)
echo $z[$i];
?>

Varianta 4

<?php

17
function sortare($v=array(),$n)
{
for($i=0;$i<$n-1;$i++)
for($j=$i+1;$j<$n;$j++)
if($v[$i]>$v[$j])
{
$t=$v[$i];
$v[$i]=$v[$j];
$v[$j]=$t;
}
return $v;
}

$n=6;
$x=array(7,5,3,8,6,9);
$z=sortare($x,$n);
for($i=0; $i<$n; $i++)
echo $z[$i];
?>

Recursivitate
Caracteristica esentiala a unei definitii recursive consta in referirea in enunt la
obiectul definit. Spunem despre o functie ca este recursiva daca ea se autoapeleaza. Ea se
poate autoapela fie direct, fie indirect prin apelul altor functii. La apelurile recursive ale
unei functii aceasta este reapelata inainte de a se reveni din ea. La fiecare apel nou al
functiei, parametrii si variabilele automatice ale ei se aloca pe stiva intr-o zona
independenta. De aceea, aceste date au valori distincte la fiecare reapelare. Nu acelasi
lucru se intampla cu variabilele statice. Ele ocupa tot timpul aceeasi zona de memorie si
deci ele isi pastreaza valoarea intre apeluri. La revenirea dintr-o functie se procedeaza la
curatirea stivei, adica stiva se reface la starea ei dinaintea apelului.
Printre avantajele recursivitatii se numara reducerea timpului de executie al
programului (in cele mai multe cazuri) prin inlocuirea structurilor repetitive cu un apel
recursiv.
 Există posibilitatea ca subprogramul să lucreze direct cu variabilele globale.
După cum ştim variabilele globale pot fi accesate din orice subprogram, dacă
sunt declarate la începutul codului sursă.
 În cazul unui număr foarte mare de autoapelări, există posibilitatea ca
segmentul de stivă să se ocupe total, caz în care programul se va termina cu
eroare.
 Recursivitatea presupune mai multă memorie.
O gândire recursivă exprimă concentrat o anumită stare, care se repetă la infinit.
Această gândire se aplică în elaborarea algoritmilor recursivi cu o modificare esenţială:

18
adăugarea condiţiei de terminare. În absenţa acestei condiţii nu se poate vorbi despre un
algoritm deoarece aceştia sunt finiţi.
 Un algoritm recursiv se elaborează folosind acest tip de gândire , nu o gândire
precum cea folosită până acum, când am elaborat algoritmi iterativi.
 Pentru orice algoritm recursiv există unul iterativ care rezolvă aceeaşi
problemă.
 Alegerea unui algoritm recursiv nu este întotdeauna avatajoasă.

Aplicatii recursive
Suma cifrelor
Enunt: Sa se scrie o functie recursiva pentru a calcula suma cifrelor unui numar
natural n.

Rezolvare:
<?php
function suma_cifre($n)
{
if (!$n) return 0;
else return $n%10 + suma_cifre($n/10);
}
$n=245;
$s=suma_cifre($n);
echo $s;
?>

Trecerea din baza 10 intr-o baza mai mica


Enunt: Sa se scrie o functie recursiva pentru a transforma un numar natural n din
baza 10 in baza b.

Rezolvare:
<?php
function transform($n,$b)
{
$rest=$n % $b; if ($n >= $b) transform($n/$b,$b);
echo $rest;
}
$n=245;
$b=2;
$nr=transform($n,$b);
echo $nr;
?>

19
Calculul celui mai mare divizor comun
Se scrie o functie recursiva pentru calculul cmmdc a 2 numere, apoi sa se
calculeze cmmdc componentelor inui vector apeland functia scrisa.

<?php
function cmmdc($x,$y)
{
if($x==$y) return $x;
else
if($x>$y) return cmmdc($x-$y,$y);
else return cmmdc($x,$y-$x);
}

$n=4;
$v=array(100,30,65,40);
$cm=cmmdc($v[0],$v[1]);
for ($i=2;$i<$n;$i++)
$cm=cmmdc($cm,$v[$i]);
echo $cm;

?>

Combinatorica recursiva
Aranjamente

Sa se genereze toate aranjamentele de n numere luate cate lc.


Ex: n=3 lc=2  1 2 ; 1 3 ; 2 1 ; 2 3 ; 3 1 ; 3 2 ;
<?php

$a=array();
$n=3;
$lc=2;

function retsol() {
global $a;
global $n;
global $lc;
for ($i = 1; $i <= $lc; $i++)
echo $a[$i] ." ";
echo"<br>";
}

function cont($l) {

20
global $a;
global $n;
global $lc;

for ($i = 1; $i < $l; $i++)


if($a[$i] == $a[$l])
return 0;
return 1;
}

function aranj($k) {
global $a;
global $n;
global $lc;

for ($i = 1; $i <= $n; $i++) {


$a[$k] = $i;
if(cont($k))
if($i == $lc) retsol();
else aranj($k+1);
}
}
aranj(1);
?>

Combinari

Sa se genereze toate combinarile de n numere luate cate lc.


Ex: n=3 lc=2  1 2 ; 1 3 ; 2 3 ;
<?php
$a=array();
$n=3;
$lc=2;
function retsol()
{
global $a;
global $n;
global $lc;
for ($i = 1; $i <= $lc; $i++)
echo $a[$i]." ";
echo "<br>";
}
function comb($k) {
global $a;
global $n;
global $lc;

21
for ($i = 1; $i <= $n-$lc +$k; $i++) {
$a[$k] = $i;
if($a[$k] > $a[$k-1])
if($k == $lc) retsol();
else comb($k+1);
}
}
comb(1);
?>

Permutari

Sa se genereze toate permutarile de n numere.


Ex: n=3  3 1 2 ; 2 3 1 ; 2 1 3 ; 3 2 1 ; 1 3 2 ; 1 2 3 ;
<?php
$p=array();
$n=3;
function tipar()
{
global $p;
global $n;
for($i=1; $i<=$n; $i++)
echo $p[$i]." ";
echo "<br>";
}

function permut($k)
{
global $p;
global $n;
if($k==$n+1) tipar();
else
{
$p[$k]=$k;
for($i=1;$i<=$k; $i++)
{
$c=$p[$i]; $p[$i]=$p[$k]; $p[$k]=$c;
permut($k+1);
$c=$p[$i]; $p[$i]=$p[$k]; $p[$k]=$c;
}
}
}
permut(1);
?>

22
Teme
Tema 1
Se citesc doua numere in baza 10. Se deplaseaza pe biti primul numar la stanga
cu 2, iar al doi-lea la dreapta cu 3, si se cere sa se afiseze in baza 2, suma celor doua
numere.

Tema 2

Sa se creeze fisierele:
Inscriere.html continand un formular cu urmatoarele campuri:
 Username
 Parola
 Email
 Submit
 Reset
Inscriere1.php care preia datele din inscriere.html si genereaza un formular cu
urmatoarele campuri:
 Nume
 Prenume
 Data nasterii
 Telefon
Inscriere2.php care preia datele din inscriere1.php si afiseaza informatiile din
inscriere.html si inscriere1.php

Tema 3

Sa se creeze o aplicatie de logare care verifica user-ul si parola si in cazul in care


s-a gresit de trei ori combinatia sa nu mai permita logare.

Tema 4

Sa se creeze o aplicatie care genereaza permutarile valorilor unui vector dat, de pe


pozitii pare.

Tema 5

23
Sa se creeze o aplicatie care genereaza toate „cuvintele” care se pot forma din
simboluri punct ( . ) si linie ( - ).

24

You might also like