Showing posts with label Limbajul PHP. Show all posts
Showing posts with label Limbajul PHP. Show all posts

Thursday, February 4, 2016

Limbajul PHP. Sesiuni. "Guess my number" game (link aplicatie)

Enuntul urmator este dat ca tema facultativa in cadrul unui curs PHP procedural iar rezolvarea sa implica realizarea unei aplicatii tipice pentru lucrul cu sesiuni si persistenta informatiei intre apelurile unui script PHP.

" Sa se implementeze urmatorul joc folosind sesiuni: computerul alege un numar pe care utilizatorul incearca sa il ghiceasca prin incercari repetate, folosind un formular. De fiecare data cand nu a ghicit, va fi ghidat afisandu-i-se "mai aproape" sau "mai departe". Cand numarul a fost ghicit, utilizatorul este felicitat, indicandu-i-se si numarul de incercari ce au condus la reusita, iar jocul va fi resetat."

Mai intai, linkul catre aplicatie si apoi rezolvarea comentataJ

Sunt trei aspecte care trebuie solutionate:

Sunday, January 31, 2016

Limbajul PHP. Formulare HTML pentru input. Un script pentru background de culoare variabila (link)

In PHP persistenta informatiei intre initializarile unui script oarecare este asigurata prin cookies si/sau sesiuni.

Enuntul urmator este dat ca tema in cadrul unui curs de PHP procedural inainte de partea de materie referitoare la cookies si sesiuni (care ar face rezolvarea mai facila J)

" Se realizeaza un formular HTML in care utilizatorul introduce componentele RGB ale culorii dorite (valorile pentru rosu, verde si albastru). Odata formularul expediat, fundalul paginii va deveni de culoarea solicitata. La aplicatia anterioara se adauga dupa fiecare din cele 3 campuri (R, G si B) doua butoane, cu etichetele "+10" si "-10". Efectul butoanelor va fi scaderea/cresterea cu 10 a valorii culorii corespunzatoare butonului (si implicit ajustarea culorii de fundal a paginii), in limita plajei de valori permise, 0 - 255."

Prima parte a enuntului nu comporta dificultati. Valorile sunt introduse in formulare de tip text input si expediate cu un buton submit.

Daca s-a apasat butonul (<==> daca in array-ul GET/POST se afla valoarea corespunzatoare cheii butonului), atunci componentele specificate in tagul
<body style = "background-color: rgb($r, $g, $b)"> primesc valorile expediate prin cele trei formulare text input.

Tuesday, January 26, 2016

Limbajul PHP. Tablouri multidimensionale. O aplicatie practica de iterare si determinare a unor valori specificate printre elementele unui tablou

Enuntul urmator reprezinta o problema de practica individuala asociata modulului de PHP procedural (PHP I) predat in cadrul InfoAcademy. 

Cum am specificat si cu ocazia altor postari, publicarea solutiei nu intentioneaza, nici pe departe, compromiterea procesului didactic la academia respectiva. 

Rezolvarea propusa aici nu este unica (e greu de vorbit de rezolvari "unice" in informatica) si, cu siguranta, nici cea mai optima sau mai "curata" la nivel de cod. Ea este utila in primul rand autorului, ca reminder in perspectiva in care va avea nevoie :-)

Enuntul:

 "Fie un magazin cu diverse modele de telefoane mobile, manufacturate de feluriti producatori. Incepeti prin a defini manual un tablou cu producatori si modelele atasate:

$modele = array(
            "producator1" => array ("model1", "model2", ...),
            "producator2" => "array("model3", "model4", ...),
         ..............................................));

Se cere:

1.Pornind de la tabloul de mai sus, generati (algoritmic) un alt tablou, numit $magazin, de forma:

$magazin = array("model1"=>array(
                                                 "producator"=> "producator1",
                                                  "caracteristici"=>array("lungime"=>...
                                                                                          "latime"=>...,
                                                                                          "greutate"=>...)),
                              "model2"=>array(
                                                "producator"=>...etc


in care dimensiunile si greutatea sunt generate aleator (in limite rezonabile, desigur).

2. Scrieti un algoritm care determina si afiseaza toate caracteristicile celui mai usor telefon (producatorul, modelul, lungime, latime, greutate);
3. Scrieti un algoritm care determina si afiseaza latimea medie a telefoanelor pentru fiecare producator in parte."

Monday, January 25, 2016

Limbajul PHP. Mini-proiect "statistic". Functii, constante, include/require etc

Enuntul urmator, adaptat din tema unui curs de PHP procedural, cere, practic, relationarea a doua fisiere php care contin functii pentru generarea si validarea unor valori numerice.

"Creati un mini-proiect PHP cu fisiere, plasat intr-un director accesibil prin URL-ul http://localhost/.../ . In acel director se vor afla urmatoarele fisiere/directoare:

1) directorul include, care contine fisierul utils.php, in care se definesc: 
a) o constanta NR_DATE, cu o valoare numerica la alegere; 
b) o functie validareData() ce valideaza o data calendaristica. Functia primeste 3 argumente: zi, luna si an (toate numerice) si verifica daca ziua se incadreaza in numarul maxim de zile ale lunii specificate; 
2) fisierul statistici_date.php, in care: 
a) se include utils.php, pentru a avea disponibile constanta si functia de validare. Se va folosi o cale relativa (require "include/utils.php"), pentru a nu face site-ul dependent de sistemul local de fisiere; 
b) se realizeaza o bucla in care se genereaza NR_DATE date calendaristice (se genereaza ziua, luna si anul folosind functia rand() ). Fiecare data generata se va afisa pe ecran: cele valide cu verde, cele invalide cu rosu. Pentru validare se va folosi functia validareData() scrisa anterior. Anul se va genera intre 1900* si 2100; 
c)la sfarsit se va afisa statistica: X date valide, Y date invalide."

In solutia propusa, validarea porneste de la criteriul lunii generate aleator. Domeniul acoperitor de generare a valorilor pentru zile este (1, 31). Daca luna este prima, a treia, a cincea, a saptea, a opta, a zecea sau a douasprezecea, corectitudinea datei este asigurata de insasi domeniul fixat pentru zile.

Daca luna este februarie (a doua) si daca valoarea este superioara lui 28 (in cod, $d > 28) atunci, daca anul ($y) este bisect (test prin functia isLeap()) si daca ziua $d == 29 inseamna ca data este valida. In cazul contrar ultimei clauze if (<==> $ > 29), data e invalida.

Daca luna este a 2-a si ziua este mai mica sau egala cu 28, data generata este valida, indiferent de an, ordinar sau bisect.

Daca luna este a patra, a sasea, a noua si a unsprazecea, orice zi $d <=30 implica o data valida, indiferent de an.

Instructiunea switch si gruparea case-urilor pentru lunile cu 30 de zile simplifica functionalitatea codului.

Pentru afisare, s-a folosit o lista neordonata intr-un element de pagina pozitionat stanga si un tabel pozitionat in dreapta listei.

Domeniul pentru anii generati cu functia rand a fost fixat la (1920, 2100). Nu ca ar avea importanta prea mare, dar in 1919, in primavara, s-a introdus in Romania reforma calendarului gregorian, astfel incat de la 14 aprilie (1 aprilie pe stil vechi) anul respectiv, datele calendaristice pot fi in mod consistent corelate cu zilele saptamanii ;-)

Saturday, January 23, 2016

Limbajul PHP. Caroiaj de sah

Codul urmator afiseaza celulele unui tabel cu 8 linii si 8 coloane colorate alternativ, dupa modelul unei table de sah.

Pentru un element oarecare al caroiajului, indecsii de linie si de coloana decid daca este aleasa una dintre cele doua culori. In exeplul dat, index linie par + index coloana par => celula de tabel are culoarea rosie (albastra daca indexul de coloana este impar). Daca indexul de linie devine impar in urma incrementarii, ordinea atribuirii culorilor se inverseaza.


Tagul de inchidere pentru linii, </tr> este pus cand indexul de linie capata valoarea "7".


Codul si prinscreen-ul:

Limbajul PHP. Functii cu numar variabil de argumente

Inca un enunt din categoria "practica individuala" asociata unui curs de PHP procedural:

"1.Sa se scrie o functie cu numar variabil de argumente care afiseaza valorile argumentelor primite sub forma unei liste HTML.
Ex: f(1,2,3) va afisa un bulleted (unordered) list cu valorile 1, 2 si 3);2. Aceeasi cerinta ca mai sus, dar functia va afisa argumentele ordonate crescator.3. Aceeasi cerinta, dar functia va avea un prim argument obligatoriu, care specifica sensul ordonarii (crescator sau descrescator)."

Intrucat ultima cerinta la inglobeaza pe anterioarele, solutia propusa o va trata pe aceasta din urma.

S-a definit functia funcTest($asc), care poate fi apelata cu un numar n>= 1 oricat de mare de argumente, apelarea fara argumente generand warning.

In corpul lui funcTest(…) este apelata functia predefinita func_num_ags(). Aceasta intoarce numarul de argumente pasate functiei funcTest(…). Daca numarul este mai mare decat 1, este apelata o alta functie predefinita, func_get_args(),  care intoarce ca rezultat un array cu argumentele pasate.

In continuare, este afisata lista cu argumente nesortate apoi se trece la sortarea acestora cu bubble sort, sensul sortarii fiind stabilit pe baza parametrului $asc(0 = crescator, 1 = descrescator). Pentru o duplicare mai redusa a codului, au fost definite functiile ascSort(…) si descSort(…), apelate din funcTest(…) in vederea sortarii efective. Doi din trei parametri sunt transferati prin referinta intrucat se doreste modificarea variabilelor respective: $count, care semnaleaza prezenta inversiunilor intre elementele listei de argumente, si, respectiv, $arr, tabloul care stocheaza argumentele.

funcTest(…) este apelata prima data cu valorile unui array initializat pseudoaleator, apoi direct cu apeluri ale functiei rand()  plasate in lista de argumente.

Codul si prinscreenul:

Monday, January 18, 2016

Limbajul PHP. Mostenirea de clase. O problema de sinteza

Enuntul urmator sintetizeaza aspectele esentiale ale mecanismului si sintaxei mostenirii de clase in PHP, intre care accesul din clasa derivata la membrii privati ai clasei parinte prin intermediul metodelor mostenite, apelarea din clasa derivata a constructorului din clasa parinte, apelul membrilor constanti, suprascrierea metodelor.

"Develop a hierarchic structure of classes:Circle and Cylinder 
The base class is Circle and the derived class is Cylinder. It inherits the method Display() from base class Circle. 
You have to define the new necessary fields and methods and override the method Display() to print the total surface area and volume of the cylinder. "


Daca baza cilindrului cu inaltimea H este cercul de raza R cu suprafata S = PI*R*R, atunci suprafata totala a cilindrului este: 2*PI*R*H + 2*S iar volumul este: S*H. 
Codul si printscreenul:

Wednesday, January 13, 2016

Overriding in C++ si PHP

"Implement 2 classes Square and Rectangle that inherit the Shape class and override the function Area."

In acest enunt luat de pe programmr.com cerinta nu este, in mod explicit, de a folosi o clasa de baza PHP abstracta (se putea adauga un corp vid al functiei Area(), {}, in clasa Shape, renuntand la cuvantul-cheie "abstract" ) dar am optat pentru aceasta din motive de "rodaj" al sintaxei. 

De asemenea, inaintea de a prezenta rezolvarea, am considerat util un reminder al sintaxei de derivare si al mecanismului de overriding in PHP si in C++ in doua exemple simple:

Wednesday, December 2, 2015

Limbajul PHP. Ordonarea unui sir numeric cu un algoritm "ineficient"

Codul urmator implementeaza probabil cel mai trivial algoritm de sortare, bazat pe urmatoarele consideratii.

1) Fie cel mai defavorabil caz al unui sir pentru care se doreste ordonarea crescatoare, adica, presupunand ca este vorba de un sir de 4 numere intregi,
$i = array(4, 3, 2, 1);

2) Ne propunem ca pentru $k = 0, $k < 4, pentru fiecare situatie $i[$k] >= $i[$k + 1] sa inversam valorile celor doua elemente, folosind in acest scop variabila intermediara $temp:

$temp = $i[$k]; $i[$k] = $i[$k + 1]; $[k + 1] = $temp;