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:

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:

Friday, January 22, 2016

Limbajul PHP. Functii. Birth date generator

Un enunt adaptat pe baza unei teme de practica individuala din cadrul unui curs de PHP procedural, predat la InfoAcademy Bucuresti.

// Se genereaza in mod aleator o data de nastere. Pentru simplificare, luna generata va fi ianuarie sau februarie.
// Se va incerca generarea zilei in intervalul corect (1-31 pentru ianuarie, 1-28 sau 1-29 pentru februarie, in functie de an).
// Se va afisa un tabel HTML cu: data generata, anul (bisect sau ordinar), zodia.

Algoritmul pentru testarea unui an (bisect/ordinar), aici.

O lista a anilor bisecti care acopera si intervalul utilizat in acest exemplu, aici.

Functia Generator() apeleaza functia is_leap($y) pentru testul numarului (pseudo)aleator care reprezinta anul. In functie de test si de valoare numerica a lunii este apoi generata ziua.

O bucla for apeleaza de 10 ori functia Generator() pentru afisarea celor 10 intrari in tabelul html.

Pe sistemul pe care s-a facut testul, codul nu este rezident in folderul www ci intr-un alias setat corespunzator.

Codul si prinscreen-ul: