Programare – particular si general, concret si abstract

pce_cursCazuri particulare si generale. De la concret la abstract si invers. Constante si variabile
• Concret si abstract
Un programator trebuie sa gandeasca abstract. Acest lucru este atat de important in programare, incat orice incercare de a invata sa programezi, fara a avea o gandire abstracta, este sortita esecului.
Cine nu poate intelege abstractiunile matematice din scoala generala sau liceu, de pilda, nu poate sa ajunga sa programeze (bine). Ca programatori, va trebui sa realizati diferite programe pentru oameni foarte diferiti ca nivel cultural, pregatire.

Veti intra in contact cu economisti, ingineri, psihologi, sau oameni de litere, medici sau avocati, care va vor solicita sa le faceti un program pe calculator care sa le rezolve anumite probleme din domeniul lor de activitate. Probabil cu exceptia inginerilor, veti constata ca majoritatea au un anumit mod de a se exprima si de a va prezenta problema de rezolvat incompatibil, intr-o oarecare masura, cu modul dumneavoastra de a vorbi si de a intelege problema. Cel mai bun sfat ar fi acela de a-i lasa sa va explice tot ce vor, fara sa-i intrerupeti, dupa care sa incercati sa „preluati dumneavoastra carma” si, prin intrebari simple, la care interlocutorul sa va raspunda doar prin da sau nu, sa intelegeti esenta problemei pe care trebuie sa o rezolvati.

In general, beneficiarii programului dumneavoastra, vor fi foarte concreti. Ei nu vor prezenta in linii mari, generale, lucrarea pe care vor sa o informatizeze, generale, ci vor da tot soiul de exemple, care nu au nici o relevanta pentru problema, din perspectiva dumneavoastra. Va trebui sa identificati, in explicatiile interlocutorului sau in raspunsurile acestuia, urmatoarele elemente:

  • ce se da si ce se cere programului, pentru ca orice program/algoritm prelucreaza anumite date de
    intrare pentru a obtine niste informatii, drept rezultate;
  • cum se vor da datele de intrare si in ce ordine, ce conditionari exista intre ele, pentru a putea
    proiecta interfata cu utilizatorul, pentru introducerea datelor;
  • ce informatii se asteapta de la program si in ce forma, in ce ordine, pentru a sti cum sa proiectati
    interfata cu utilizatorul, pentru extragerea rezultatelor;
  • care sunt formulele de calcul care se folosesc, in ce ordine si ce conditionari exista intre ele.

In privinta interfetei cu utilizatorul, fiti convinsi ca beneficiarul se va razgandi de mai multe ori, mai ales atunci cand programul capata o forma apropiata de cea finala, de aceea nu trebuie sa acordati prea multa atentie acestui aspect, pentru inceput. Concentrati-va asupra formulelor de calcul si e posibil ca aici sa aveti multe dificultati de a le obtine din cauza ca ele nu va vor fi prezentate, pur si simplu! Cei mai multi prefera sa va dea exemple si dumneavoastra sa deduceti singur formulele de calcul, decat sa va spuna care este formula din teorie. Deci, va trebui sa gasiti generalul din cazurile lor particulare si sa abstractizati tot ceea ce va prezinta ei concret.

• Constante si variabile
Sa revenim la problema desenarii pe ecranul calculatorului. Sa presupunem ca dispunem de un mediu de programare, in care, pentru a desena un cerc de raza r, cu centrul cercului in punctul de coordonate x,y trebuie sa folosim instructiunea CIRCLE(x,y,r). De obicei, instructiunile sunt prezentate folosind variabile (precum x, y si r) si nu constante (numere ca 100, 150, 215, 342).
Pentru a desena un cerc avand centrul in punctul de coordonate 200, 300, si cu raza de 10 de unitati vom scrie, asadar, CIRCLE(200,300,10), pastrand ordinea celor trei parametri ai instructiunii. La fel, putem particulariza folosirea lui CIRCLE, si pentru cercul de coordonate 200, 300 si de raza 20:
CIRCLE(200,300,20). Evident, cele doua cercuri sunt concentrice, pentru ca au aceleasi coordonate
pentru centru.
Pentru a desena 15 asemenea cercuri concentrice, de raze de 10, 20, 30 etc., ar trebui sa folosim 15 instructiuni CIRCLE, in care cel de-al treilea parametru sa fie schimbat, pe rand, in 10, 20 s.a.m.d.. Acest mod de rezolvare a problemei desenarii celor 15 cercuri concentrice denota o gandire pur concreta, care se bazeaza pe utilizarea a 15 cazuri particulare de desenare a unor cercuri. Un programator bun nu va proceda asa, el va cauta sa gaseasca o regula pentru desenarea mai usoara a celor 15 cercuri, eventual pomenind o singura data de comanda CIRCLE. Astfel, el va incerca sa inlocuiasca constantele numerice 10, 20, 30, …, 150, cu o singura data, care sa varieze intre 10 si 150, din 10 in 10. O asemenea data se numeste variabila. Ea isi va schimba valoarea, in functie de necesitati. Astfel, notand cu R acea variabila, cele cincisprezece cazuri concrete vor ajunge cazul abstract CIRCLE(200,300,R), unde R variaza intre 10 si 150, cu pasul 10. Limbajele de programare ofera diferite posibilitati de a-l face pe R sa ia pe rand valorile 10, 20 etc., dar putem sa ne gandim mai departe la o alta variabila I, care sa varieze intre 1 si 15, si sa scriem CIRCLE(200,300,10*I), unde I variaza intre 1 si 15, cu pasul 1. Putem continua, considerand un caz si mai general, deci mai abstract, in care pasul sa nu fie 10, ci un numar oarecare, reprezentat de
variabila P. Atunci vom scrie CIRCLE(200,300,P*I), considerandul-l pe I intre 1 si 15. Dar s-ar putea ca sa avem nevoie sa desenam nu doar 15 cercuri, ci 20 sau 50, adica un numar N oarecare. Si poate acestea vor avea centrul intr-un punct de coordonate X, Y, oarecare, iar razele sa inceapa sa creasca de la valoarea T. Astfel, cel mai abstract caz este: CIRCLE(X,Y,T+P*I), unde I ia valori, din 1 in 1, intre 0 si N-1. Astfel, X, Y, T, P si N sunt date de intrare in problema, I este o variabila de lucru, iar rezultatul ar fi cele N cercuri desenate pe ecran.
Procesul de abstractizare este foarte complex si este greu de explicat ce mecanisme intelectuale si psihice intra in joc, atunci cand abstractizam. Trebuie sa dovedim multa imaginatie si sa incercam sa ne gandim si la alte situatii decat cele concrete cu care avem de a face la un moment dat. Pentru a abstractiza cat mai mult o problema si rezolvarea ei, va trebui sa ne punem intrebari de genul „ce-ar fi daca nu as cunoaste aceasta valoare?” sau „ce-ar fi daca as schimba aceasta valoare cu alta?” si sa incercam sa raspundem la asemenea intrebari, rescriind algoritmul.