Professional Documents
Culture Documents
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 ('>>')
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
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.
3
Precedenţa operatorilor
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
5
In ciuda acestor dezavantaje, variabilele cookie raman cea mai popularea tehnica
pentru obtinerea unui mediu de stocare pe termen lung
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));
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);
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.
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
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
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.
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)
<?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();
?>
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: 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
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';
}
?>
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.
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
<?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;
?>
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
$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;
function aranj($k) {
global $a;
global $n;
global $lc;
Combinari
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
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
Tema 4
Tema 5
23
Sa se creeze o aplicatie care genereaza toate „cuvintele” care se pot forma din
simboluri punct ( . ) si linie ( - ).
24