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:

Tuesday, February 2, 2016

Limbajul PHP. Cookies. Greseala de incepator :-) (link aplicatie)

Un server poate gazdui un numar oarecare de scripturi sau de aplicatii-site, fiecare programat, eventual, sa foloseasca mecanismul de cookies. Fiecare dintre site-urile care trimit cookies seteaza acestor cookies, in afara de nume (cheie) si valoare, alti parametri precum timpul de expirare, domeniul si calea.

Exista, desigur, scenarii in care se folosesc valorile implicite ale parametrilor optionali.
Neglijarea acestor valori implicite (sau a logicii dupa care ele sunt generate) se soldeaza, uneori, cu consecinte neplacute.

Spre exemplu, fie enuntul urmator, dat ca tema in cadrul unui curs de PHP procedural:

" Se concepe un formular HTML in care utilizatorul alege dintr-un drop-down list site-ul catre care doreste sa mearga. Dupa expedierea formularului, utilizatorul va fi redirectionat catre site-ul ales. 
1) Adaugire: se va include un checkbox "Remember my decision". Odata ce utilizatorul a ales un site, a bifat checkbox-ul si a expediat formularul (fiind redirectionat catre site-ul ales), la fiecare vizita ulterioara el va fi automat redirectionat catre site-ul ales initial. 
2) Adaugire: odata ales site-ul default, la vizitele ulterioare, pagina va contine un buton "Reset my website preference". Apasarea acestui buton duce la anularea site-ului default - la urmatoarea vizita, utilizatorului i se va prezenta din nou pagina de selectie de site".

Primele doua cerinte nu comporta probleme: se folosesc formularele HTML corespunzatoare, functia header(), functia setcookies(). "Surprizele"pot sa apara la ultimul punct.

Presupunem ca formularul html este gazduit pe prima pagina a unui site, sa-i spunem site-ul A, iar selectia din drop-down list redirecteaza utilizatorul catre site-urile B, C, D…. Pentru simplitate, vom limita momentan drop-down list la un singur site, B, care poate fi bifat sau nu ca favorit, in vederea redirectarii automate.

Site-ul A se afla intr-un folder oarecare pe masina locala, sa-i spunem "practice1", iar site-ul B se afla intr-un subfolder al lui practice1, sa-i spunem "targets". Aceasta configuratie este importanta si vom vedea imediat de ce.

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 C++. Numere prietene.

Un enunt clasic: 

"Dat fiind un numar intreg fixat ca limita, sa se gaseasca toate numerele prietene pana la aceasta limita, inclusiv."

Numerele naturale x si y sunt prietene daca toti divizorii lui x, exclusiv x, inclusiv 1, insumati, egaleaza y si reciproc.

Prima pereche de numere prietene este (220, 284) pentru ca suma divizorilor lui 220, 1 + 2 + 4 + 5 + 10 + 11 + 20 + 22 + 44 + 55 + 110, este egala cu 284.

Divizorii lui 284 sunt 1, 2, 4, 71 si 142 iar suma lor este 220.

In codul urmator, functia isFriend(...) testeaza secvential toate numerele intre 1 si numarul-limita, inclusiv, calculand suma divizorilor, sum_div. Numarului obtinut astfel i se calculeaza, de asemenea, divizorii iar daca suma lor este egala cu numarul natural luat ca argument la iteratia curenta, i, atunci cele doua numere, i si sum_div, sunt prietene.

Variabila globala int last memoreaza ultimul numar prieten determinat ca suma a divizorilor la o iteratie oarecare i.

Acesta este "sarit" cand variabila-contor ajunge la el, pentru evitarea duplicarii perechilor.

isFriend(...) intoarce 1 daca este gasita o pereche de numere prietene si 0 in caz contrar, ceea ce permite determinarea numarului de perechi ca suma a rezultatelor intoarse pe parcursul iteratiilor.


Codul si prinscreenul:

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: