Wednesday, January 13, 2016

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."

Thursday, December 31, 2015

Limbajul C++. Implementarea unei functionalitati aritmetice intr-o clasa

Exemplul urmator propus de programmr.com are un singur aspect netrivial: se cere ca initializarea membrilor clasei sa se faca prin metode, si nu prin explicitarea constructorilor.

Clasa student invocata in enunt are trei membri - un string care prezerva numele studentului, un integer pentru matricola si un tablou de intregi pentru notele la cinci materii.

O metoda publica input initializeaza membrii dupa instantierea unui obiect student. O alta metoda publica output afiseaza media notelor.

Enuntul original:

"A class student has three data members: name, roll, marks of 5 subjects and member functions to input name, roll no and marks, and display Percentage. Declare the class student and define the member functions. The program should ask user for name, roll no and marks in 5 subjects, and should display the percentage."

Codul si printscreen-ul:

Limbajul C++. Alte probleme cu siruri de caractere

Doua enunturi fara mari dificultati de pe programmr.com, cu mentiunea ca am folosit pentru initializarea sirurilor de caractere, in locul "batranei" functii gets(char *str) din biblioteca C, metoda getline din clasa std::istream. 

Aceasta incarca in spatiul indirectat de char * str un numar specificat, n, de caractere inclusiv terminatorul de sir. Adica, daca dorim sa impunem citirea a maxim 50 de caractere, linia corespunzatoare va fi:

cin.getline(str, 51);

Primul enunt cere scrierea unui cod care converteste fiecare caracter al unui sir de caractere in echivalent binar, fiind luate in calcul si eventualele spatii si semne de punctuatie.

O functie de conversie realizeaza 8 impartiri la 2 ale codului ASCII corespunzator fiercarui caracter transmis ca parametru, pentru a initializa bitii care codifica respectivul caracter, stiut fiind ca o variabila de tip char ocupa 8 biti in memorie.

Codul si printscreen-ul:

Wednesday, December 30, 2015

Limbajul C++. Capitalizarea literelor sau o problema stil K & R


Un exemplu de cod care numara cuvintele intr-un sir de caractere este prezentat in cartea scrisa de Kernighan si Ritchie.

Enuntul urmator, "Write a program which takes input string and capitalizes the first character of each word in a string, and does not affect the others"  este de pe site-ul programmr.com, dar cu siguranta poate fi intalnit in multe alte locuri/lucrari.

Rezolvarea problemei se bazeaza pe acelasi mecanism descris in lucrarea lui K & R:

- definirea unui cuvant ca o succesiune de caractere non-space care sunt bordate de spaces. Desigur, pe baza acestei definitii, ,,,#@sg-abcd,, este un cuvant, ceea ce poate parea derutant in raport cu bunul simt. Desigur, asd_g def este, conform aceleiasi definitii, o succesiune de doua cuvinte, asd_g si def.

- declararea si setarea unei variabile inword  care "tine cont" daca la un moment oarecare (la o iteratie oarecare) ne aflam sau nu in interiorul unui cuvant.

Daca s este un sir de caractere introdus de la tastatura, a carui lungime length o vom determina, atunci algoritmul implementat poate fi urmatorul: