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:

Thursday, January 21, 2016

C/C++ language. A funny challenge: sorting numbers without using arrays

From programmr.com: 

"Write a program which accepts 3 integers and sort them in ascending order."

Of course, we can use the ternary operator or some if/else statements in order to find the largest and smallest of the three numbers, respectively.

Once done that, we need to find the intermediate value using if/else statements.

The code and the print screen:

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:

Limbajul C/C++. Operatorul ternar versus if/else

Sigur ca pare doar un mic amuzament sa rezolvi o problema de decizie cu operatorul ternar, singurul din tot limbajul care functioneaza cu trei operanzi. Uneori insa, in virtutea conciziei, o astfel de optiune este justificata, dupa cum este justificat, ba chiar preferabil, din considerente de eficienta, sa faci atribuirea:

int x = 0;
while(x <= 10) {x += 1;} in loc de "x = x + 1;"

intrucat in al doilea caz x este evaluat de doua ori.

Enuntul de pe programmr.com:

"Take input of experience and age of a person.
If the person is experienced and his age is equal to or more than 35 the slary of the person is 6000. Otherwise, if the person is experienced and his age is equal to or more than 28 but less than 35, then the salary should be 4800.For experienced person below 28 yr of age the salary should be 3000 and for inexperienced person the salary should be 2000."

Tuesday, January 12, 2016

Limbajul C++. Mostenirea de clase si o problema un pic stranie

Mostenirea implica regulile cunoscute din orice carte care trateaza limbajul C++:

- in cazul mostenirii publice, membrii publici si protected mosteniti in clasa derivata isi pastreaza nivelul de acces iar membrii privati sunt inaccesibili altfel decat prin intermediul eventualelor metode publice din clasa de baza;

- in cazul mostenirii protected, membrii publici si protected ai clasei de baza devin protected in clasa derivata, cei privati fiind inaccesibili cu observatia anterioara;

- in cazul mostenirii private, membrii publici si protected devin privati.

Daca avem urmatoarea situatie de mostenire multipla,

class X
{ public:  char i;};

class Y
{ public: float  i;};

class Z : public X, public Y
{
public:
long i;
};

ce se va initializa la succesiunea
….
z zed; 
zed.i = 500;
….
?

Sau, in alte cuvinte, compilatorul va furniza warning la atribuirea zed.i = 18.21?

Limbajul PHP. Guessing game. Tablouri multidimensionale

Urmatorul enunt de pe www.programmr.com este o problema simpla cu sase scenarii posibile, raspunsurile de selectie fiind introduse de la tastatura.

Se cere sa se identifice prin doua interogari un obiect intr-o matrice 2 x 3 (screen-ul urmator).

Din pacate, softul de pe programmr.com valideaza si topica si compozitia stringului de iesire, dupa urmatorul pattern.

1) "alive" & "outside" sau "alive" & "inside":  Obviously the living thing on your mind is a ...

2) "not alive" & "outside" sau "not alive" & "inside" : Obviously the nonliving thing on your mind is a ...
3) ("alive" sau "not alive") && "both":   Obviously the nonliving thing inside/outside on your mind is a ...

Altminteri, problema e triviala iar varianta comoda este stocarea entitatilor living/not living etc intr-un tablou bidimensional cu cheile indicate mai jos.


Friday, January 8, 2016

Limbajul PHP. The proper way to adress someone ... in English :-)


Conform multiplelor surse, e o mica bataie de cap sa te adresezi "cu eticheta" unei persoane in limba engleza, presupunand ca nu-i cunosti dinainte sexul, varsta si starea civila.

Teoria spune ca daca e vorba de femei majore, nemaritate, folosesti formula ambigua Ms. in fata numelul de familie (last name) sau chiar in fata numelui intreg. Daca femeia-i maritata, folosesti fara teama Mrs. in fata numelui (intreg sau de familie). Ambele formule isi au originea in "Mistress".

Enuntul urmator de pe programmr.com introduce in plus urmatoarea regula fara discriminare de sex: daca varsta este sub cea a majoratului, persoana este chemata pe numele complet. Daca e vorba de un barbat major, se foloseste Mr. inaintea numelui de familie.

"Write a program which displays an appropriate name for a person, using a combination of nested if's and compound conditions. Ask the user for a gender, first name, last name and age.
If the person is female and 20 or over, ask if she is married. If so, display "Mrs." in front of her name. If not, display "Ms." in front of her name. If the female is under 20, display her first and last name.
If the person is male and 20 or over, display "Mr." in front of his name. Otherwise, display his first and last name.
Note that asking a person if they are married should only be done if they are female and 20 or older."