Arhive categorie: Grafică

The Beauty of Code – Echipe care au trimis rezolvări

Următoarele echipe au trimis rezolvări pentru prima etapă a concursului de informatică pentru fete “The Code of Beauty – The Beauty of Code”

  1. Dumitrescu Andreea (Colegiul Național „Mihai Viteazul”, București) și Dervis Diana (Colegiul Național „Sfântul Sava”, București)
  2. Hîncu Alice (Colegiul Național „Gheorghe Vrănceanu”, Bacău) și Beresteanu Alexandra (Colegiul Național „Gheorghe Vrănceanu”, Bacău)
  3. Zara Mara (Colegiul Național „Emil Botta”, Adjud) și Arsene Diana (Colegiul Național “Emil Botta”, Adjud)
  4. Trandafir Denisa-Adriana (Colegiul Național „Ienăchiță Văcărescu”, Târgoviște) și Onea Ioana-Cătălina (Colegiul Național „Ienăchiță Văcărescu”, Târgoviște)
  5. Bădescu Alexandra (Liceul Tehnologic Administrativ și de Servicii „Victor Slăvescu”, Ploiești) și Sandu Corina (Liceul Tehnologic Administrativ și de Servicii „Victor Slăvescu”, Ploiești)
  6. Pribagu Alexandra-Elena (Colegiul Național „Vasile Alecsandri”, Bacău) și Smău Alexandra-Mara (Colegiul Național „Vasile Alecsandri”, Bacău)
  7. Munteanu Bianca-Stefania (Colegiul Național „Gheorghe Vrănceanu”, Bacău) și Murariu Alexandra (Colegiul Național „Gheorghe Vrănceanu”, Bacău)
  8. Buraga Andreea-Elena (Colegiul Național „Emil Botta”, Adjud) și Prisecaru Alexia-Nicoleta Colegiul Național „Emil Botta”, Adjud)
  9. Zachman-Țîșcă Roxana (Liceul Teoretic „Ion Borcea” Buhuși) și Sava Cosmina-Narcisa (Liceul Teoretic „Ion Borcea” Buhuși)
  10. Ursoiu Ioana (Colegiul Național „Ion Luca Caragiale” Ploiești) și Tănase Andreea (Colegiul Național „Ion Luca Caragiale” Ploiești)
  11. Păun Mirela (Colegiul Național „Alexandru Ioan Cuza”, Galați) și Damian Oana-Ștefania (Colegiul Național „Alexandru Ioan Cuza”, Galați)
  12. Ivu Carina (Colegiul Național „Gheorghe Vrănceanu”, Bacău) și Nanu Alexandra (Colegiul Național „Gheorghe Vrănceanu”, Bacău)
  13. Popescu Diana Maria (Colegiul Național de Informatică „Tudor Vianu”, București) și Mosteanu Alina Miahaela (Colegiul Național de Informatică „Tudor Vianu”, București)
  14. Mitroi Elena-Andreea (Colegiul Național de Informatică „Matei Basarab”, Râmnicu Vâlcea) și Rotaru Mira (Colegiul Național de Informatică „Matei Basarab”, Râmnicu Vâlcea)
  15. Tudor Ștefania – Miruna (Colegiul Național „I. L. Caragiale”, Ploiești) și Andronache Mădălina – Georgiana (Colegiul Național „I. L. Caragiale”, Ploiești)
  16. Mocanu Maria Alexandra (Colegiul Național de Informatică „Tudor Vianu”, București), Halean Eusebia (Colegiul Național de Informatică „Tudor Vianu”, București)
  17. Stan Andra Beatrice Corina (Colegiul Național „Roman Vodă”, Roman) și Bolog Andreea Ioana (Colegiul Național „Roman Vodă”, Roman)
  18. Tanțoș Maria Iuliana (Colegiul Național „Ferdinand I”, Bacău) și Băluță Alexia (Colegiul Național „Ferdinand I”, Bacău)
  19. Pană Alexandra (Colegiul Național „Ienăchiță Văcărescu”, Târgoviște) și Cojocaru Anne-Marie-Zoe (Colegiul Național „Ienăchiță Văcărescu”, Târgoviște)
  20. Neguriță Diana-Gabriela (Colegiul Național „Gheorghe Vrănceanu”, Bacău) și Pătrăşcan Alina-Monica (Colegiul „Mihai Eminescu”, Bacau)
  21. Șerban Alexandra (Colegiul Național „Vasile Alecsandri”, Galați) și Gheorghiță Andreea (Colegiul Național „Vasile Alecsandri”, Galați)
  22. Mocanu Ioana (Colegiul Național „Vasile Alecsandri”) și Senteș Aida (Colegiul Național „Vasile Alecsandri”, Bacău)
  23. Rac Ioana (Colegiul Național „I. L. Caragiale” București) și Marinescu Ștefania Ioana (Colegiul Național de Informatică „Tudor Vianu”, București)
  24. Paraschiv Andreea (Colegiul Național „Mircea cel Bătrân”, Râmnicu Vâlcea) și Dincă Diana (Colegiul Național „Mircea cel Bătrân”, Râmnicu Vâlcea)
  25. Șerbănică Andreea-Maria (Colegiul Național „Mircea cel Bătrân”, Râmnicu Vâlcea) și Rădulescu Alexandra (Colegiul Național „Mircea cel Bătrân”, Râmnicu Vâlcea)
  26. Nicula Maria (Colegiul Național de Informatică „Matei Basarab”, Râmnicu Vâlcea) și Nicula Andreea (Școala „Take Ionescu”, Râmnicu Vâlcea)
  27. Boca Elena Iustina (Colegiul Național de Informatică „Tudor Vianu”, București) și Drăguț Maria Clara (Colegiul Național de Informatică „Tudor Vianu”, București)

Rezultatele se vor afișa mâine, 15.06.2019, la ora 23.00.

Să vedem care sunt echipele care se vor califica pentru etapa a doua, în care vor lucra în Scratch.

Concursul începătorilor

Concursul începătorilor este un concurs pe echipe grupa A, care s-a desfășurat în 30.03.2019, ora 14.00, Colegiul Național „Gheorghe Vrănceanu”

Concursul se va organiza pe echipe. Va fi organizat pe 30 martie 2019.

Ora 10:00 – Colegiul Național „Ferdinand I”, Bacău (Amfiteatrul „Solomon Marcus”) – Prezentarea doamnei Ica Băluță (Banca Raiffeisen Bacău, agenția „Vasile Alecsandri”) despre cum puteți intra în posesia premiilor. Vă puteți face cont IBAN și card și după concurs.

Ora 10:15 – Colegiul Național „Ferdinand I”, Bacău (Amfiteatrul „Solomon Marcus”) – Prezentarea domnului profesor univ. dr. Adrian Atanasiu (Facultatea de Matematică și Informatică, Universitatea din București) – „Raționament și logică în rezolvarea problemelor”. Domnul profesor va prezenta probleme de logică, de genul problemei de logică ce va fi dată la concurs. Prezentarea se termină la ora 12.45 și va fi interactivă. Este prevăzută și o pauză de 15 minute. Veniți cu un pix și cu câteva foi de hârtie. Cei care vin la concurs, să-și aducă și laptopurile.

Ora 13:15 – Masa de prânz la Colegiul Național „Gheorghe Vrănceanu” pentru cei care participă la concurs.

Ora 14.00 – Începerea concursului propriu-zis. Va dura până la ora 17.00, iar la ora 17.30 se vor anunța premiile.

La concurs pot participa echipe de 2-4 persoane din grupa A. Participanții la concurs trebuie să-și facă un cont la banca Raiffeisen la orice agenție din Bacău (inainte sau dupa concurs).

Atenție! Participarea la prezentarea domnului profesor Adrian Atanasiu vă aduce 7 puncte. Dacă aduceți n persoane noi în cercul de informatică, primiți încă 5xn puncte (iar ei primesc 7 puncte pentru prima prezență). Pentru participarea la concurs, primiți încă 3 puncte. Toate aceste puncte vă ajută să vă mențineți locul fruntaș în clasamentul pentru tabăra gratuită de la vară, precum și o excursie gratuită la Sky Gyimes.

Premiile acordate

Premiile vor fi acordate de Raiffeisen Bank și Asociația EduSoft pe echipe. Compania ISSCO din Bacău ne susține în organizarea concursului. De asemenea, DAMOVE Catering / Restaurantul Macu’ Roșu din Bacău va oferi o masă participanților la concurs.

        

  • 1 Premiul I: 250 lei + excursie gratuită
  • 1 Premiul II: 220 lei + excursie gratuită
  • 2 Premiul III: 180 lei + excursie gratuită
  • 5 Mențiune: 150 lei + excursie gratuită
  • Toți concurenții vor beneficia de excursie gratuită la Sky Gyimes

Subiectele

  • 1 subiect la nivelul materiei parcurse la școală, la clasa a IX-a: (5p)
  • 1 subiect la nivelul materiei parcurse la școală, la clasa a X-a: (5p)
  • 1 subiect de grafică, la nivelul a ceea ce s-a predat la cercul de informatică: (5p)
  • 1 subiect de logică, la nivelul problemelor ce vor fi prezentate de domnul profesor Adrian Atanasiu, la ora 10 la Colegiul Național „Ferdinand I”. (5p)

Echipe înscrise în concurs

S-au înscris în concurs următoarele echipe. Participanții sunt rugați să vină cu laptopuri (preferabil măcar două laptopuri), pixuri și foi albe. Puteți avea și materiale de informare, veți avea acces și la Internet, pentru a vă documenta. Menționăm că nu se mai acceptă modificări în ceea ce privește componența echipelor de concurs.

Echipa 1: it ain’t much, but it’s honest work

1. Dragomirescu Emilia, C. N. “Gheorghe Vranceanu” Bacău
2. Gavril Andrei, C. N. “Gheorghe Vranceanu” Bacău
3. Pătruț Ștefan, C. N. “Gheorghe Vranceanu” Bacău
4. Mihai Adelin Lungu C. N. “Gheorghe Vranceanu” Bacău

Echipa 2: The + Girls
1. Bereșteanu Alexandra, C. N. “Gheorghe Vranceanu” Bacău
2. Stan Raluca, C. N. “Gheorghe Vranceanu” Bacău
3. Croitoru Toma, C. N. “Dimitrie Ghicka” Comanesti
4. Colceru Cosmin, C. N. “Dimitrie Ghicka” Comanesti

Echipa 3: NoIdea
1. Cristea-Eduard Petru, C. N. “Gheorghe Vranceanu” Bacău
2. Rotaru Radu-Andrei, C. N. “Gheorghe Vranceanu” Bacău
3. Moisă Victor-Gabriel, C. N. “Gheorghe Vranceanu” Bacău
4. Mazilu Mircea, C. N. “Dimitrie Ghicka” Comanesti

Echipa 4: Eminescu
1. Borșan Andrei, Colegiul “Mihai Eminescu” Bacău
2. Patrascan Alina, Colegiul “Mihai Eminescu” Bacau
3. Sidoreac Ioana, Colegiul “Mihai Eminescu” Bacau

Echipa 5: cout<<“WE ARE CODE”;
1. Cancel Nicole, C. N. “Gheorghe Vranceanu” Bacău
2. Nanu Alexandra, C. N. “Gheorghe Vranceanu” Bacău
3. Strătilă Răzvan, C. N. “Gheorghe Vranceanu” Bacău
4. Vlad Teodora, C. N. “Gheorghe Vranceanu” Bacău

Echipa 6: InfoArt
1. Radu Mihaela, C. N. “Gheorghe Vranceanu” Bacău
2. Păscăluță Ilie, C. N. “Gheorghe Vranceanu” Bacău
3. Botoi Petru-Vlad, C. N. “Gheorghe Vranceanu” Bacău

Echipa 7: noname
1. Babiuc Daria, C. N. Catolic “Sf Iosif” Bacau
2. Coman Marian-Constantin, C. T. “Dimitrie Ghika” Comănești

Echipa 8: CodeKnights
1. Aradei Robert, C. N. “Gheorghe Vranceanu” Bacau
2. Resmeriță Teodora, C. N. “Gheorghe Vranceanu” Bacau
3. Machidon Alexandru, C. N. “Gheorghe Vranceanu” Bacau

Echipa 9: P=NP
1. Olteanu Mihai-Florin, C.N. “Gheorghe Vranceanu” Bacau
2. Ivu Carina-Andreea, C. N. “Gheorghe Vranceanu” Bacau
3. Bantu Anisia, C. N. “Dimitrie Ghicka” Comanesti
4. Grajdan Mihaela, C. N. “Dimitrie Ghicka” Comanesti

Juriul este format din

  1. Președinte: prof. univ. dr. Adrian Atanasiu (Universitatea din București)
  2. Vice-președinte: lect. univ. dr. Bogdan Pătruț (Universitatea „Alexandru Ioan Cuza” din Iași)
  3. Vice-președinte: ec. Gabriel Ivu (Raiffeisen Bank Bacău)

Membri:

  1. Alice Hîncu (cl. a XI-a, C. N. „Gheorghe Vrănceanu” Bacău)
  2. Bianca Munteanu (cl. a XI-a, C. N. „Gheorghe Vrănceanu” Bacău)
  3. Mihai Nejneriu (cl. a XI-a, C. N. „Vasile Alecsandri” Bacău)
  4. Ștefan Butacu (cl. a XI-a, C. N. „Gheorghe Vrănceanu” Bacău)

 

Marian Popovici – primul elev care prezintă realizările sale la cerc

Marian Popovici, elev din clasa a XI-a, la Colegiul Tehnic „Dimitrie Ghika” din Comănești, județul Bacău, este unul dintre cei mai activi elevi din cercul nostru de informatică.
Fiind pasionat de informatică, Marian a fost foarte încântat când a auzit de „Programare cu răbdare”, deoarece a considerat că e un prilej bun de a-și îmbunătăți cunoştințele şi, în acelaşi timp, de a cunoaşte oameni cu aceleaşi obiective ca ale sale.
Eram plictisit de consola neagră de la şcoală, iar atunci când am văzut modul în care se face grafică pentru jocuri am rămas plăcut surprins. Am învăţat o mulțime de lucruri şi am cunoscut oameni deosebiţi, care au lucrat sau lucrează la companii de top şi care m-au motivat să lucrez mai mult.
Marian a realizat deja câteva aplicații frumoase, de unul singur, acasă, după ce a învățat elemente de grafică la cercul de informatică.
Marian va prezenta colegilor săi realizările sale, la întâlnirea din 26 ianuarie, de la Colegiul Național „Gheorghe Vrănceanu”. Colegii săi vor putea pune întrebări și vor putea învăța de la Marian cum a gândit proiectele sale, vor primi sfaturi și vor fi încurajați să muncească.
Felicitări, Marian!

Grafică în CodeBlocks

1. Biblioteca grafică WinBGIm

Biblioteca grafică WinBGIm se poate descărca de aici:

winbgim.zip

Atenție: pe web găsiți alte variante ale acestei arhive, dar nefuncționale.

Dupa ce descarcati și scoateți fișierele din această arhivă, veți face următoarele lucruri:

  1. Extrageti fisierele graphics.h, winmgim.h si libbgi.a din arhiva winbgim.zip.
  2. Copiati fisierele graphics.h si winbgim.h in folderul include din compilatorul MinGW, care se gaseste, cel mai probabil, aici: c:\Program Files\CodeBlocks\MinGW\include\
  3. Copiati fisierul libbgi.a in folderul lib al directorului compilatorului MinGW, care se gaseste, cel mai probabil, aici: c:\Program Files\CodeBlocks\MinGW\lib\
  4. In Code::Blocks accesati Settings >> Compiler… >> linker settings
  5. Faceti click pe butonul Add in partea Link libraries, apoi rasfoiti si selectati fisierul libbgi.a
  6. In partea dreapta (adica la Other linker options) scrieti urmatoarele comenzi:
    -lbgi -lgdi32 -lcomdlg32 -luuid -loleaut32 -lole32
  7. Faceti click pe OK.

Descrierea functiilor grafice se gaseste aici:

http://www.cs.colorado.edu/~main/cs1300/doc/bgi/bgi.html

Un exemplu de program de test pentru grafica este aici:

#include <iostream>
#include <graphics.h>
#include <winbgim.h>

int main()
{

  initwindow(800,600);

  int x = 400, y = 300, r; 
  for (r = 25; r <= 125; r += 20)
      circle(x, y, r);

  getch();
  closegraph();
  return 0;
}

Daca acesta functioneaza, puteti continua sa folositi orice functie grafica si de lucru cu mouse-ul din biblioteca WinBGIm.

Succes!

2. Exemple de programe grafice

  • Desenarea unei table de șah, folosind doar primitiva grafică line -: la tablă
  • Desenarea graficului unei funcții, folosind doar primitiva grafică line -: la tablă
  • Desenarea unui poligon regulat, a unei stele, folosind doar primitiva grafică line -: la tablă

Presupunem că puteți lucra în modul grafic, pe un ecran cu latime*inaltime pixeli în care coordonatele colțului stânga sus sunt (0, 0), iar ale colțului dreapta-jos sunt (latime-1, inaltime-1). În acest mod grafic, dispuneți de următoarele primitive grafice
o funcție grafică void setcolor(unsigned int c), care stabilește culoarea pentru a desena următoarele linii, până la schimbarea culorii de un alt apel al acestei funcții (inițial se consideră c=0, implicit); c este un cod de culoare, care corespunde unei valori între 0 și 15, de exemplu 0=negru, 1=albastru, 2=roșu etc.
o funcție grafică void setwidth(unsigned int g), care stabilește grosimea (1<=g<=10, implicit g=1) de desenare a următoarelor linii, până la un nou apel al acestei funcții;
o funcție grafică void line(unsigned int x1, unsigned int y1, unsingned int x2, unsigned int y2) care trasează o linie între punctul de coordonate (x1, y1) și cel de coordonate (x2, y2), în culoarea curentă, de grosimea curentă;
o funcție void setfillcolor(unsigned int c), care stabilește culoarea de umplere pentru următoarele apeluri ale funcției fill de mai jos; c este implicit 0 (negru), dar poate fi orice valoarea 0<=c<=15;
o funcție void fill(unsigned int x1, unsigned int x2, unsigned int c), care colorează (prin umplere) în culoarea stabilită de funcția setfillcolor, conturul închis, mărginit de o linie poligonală închisă, având culoarea c. Colorarea începe în punctul de coordonate (x1, y1), care se presupune a fi în interiorul acelei linii poligonale.
(0,30p) Definiți o structură de date adecvată pentru a reprezenta o stea regulată cu un număr de colțuri (cel puțin 3), cu marginea de o anumită culoare și grosime, cu o anumită culoare în interior, cu o anumită mărime și o anumită „deschidere” a colțurilor, cu o anumită amplasare sub un anumit unghi față de orizontală a primului colț. Se pot folosi funcțiile trigonometrice sin și cos, din math.h.
(0,90p) Scrieți o funcție care să deseneze o asemenea stea, oarecare, amplasată oriunde și oricum, de culoare oarecare etc.
Click aici pentru solutie.

 

Un program de grafică cu o matrice în spate

#include <iostream>
#include <winbgim.h>
#include <stdlib.h>

using namespace std;

#define MAX 20
#define FUNDAL CYAN

int stanga,sus,width,height,latura, numar;
bool gata;

int TablaDeJoc[MAX][MAX];

int scor;

void afiseazaScor()
{
   char sirScor[10];
   setcolor(FUNDAL);
   itoa(scor,sirScor,10); outtextxy(200,50,sirScor);
   int i,j;  scor=0;
   for (i=1;i<=numar;i++)
       for (j=1;j<=numar;j++)
           if (TablaDeJoc[i][j]==2)
              scor++;
   setcolor(BLUE); itoa(scor,sirScor,10);
   outtextxy(200,50,sirScor);
}

void punerePiesa()
{
   int linia,coloana,x,y;
   int x1, y1, x2, y2;
   int xmijloc, ymijloc;

   if(ismouseclick(WM_LBUTTONDOWN))
     {
       clearmouseclick(WM_LBUTTONDOWN);
       x=mousex(); y=mousey();
       if (!(x>=stanga && x<=stanga+width && y>=sus&&y<=sus+height))
          gata=true;
       else
          {
            linia=(y-sus)/latura+1;
            coloana=(x-stanga)/latura+1;
            if (TablaDeJoc[linia][coloana]==0)
               {
                 TablaDeJoc[linia][coloana]=1;
                 // stergere
                 setcolor(FUNDAL); setfillstyle(SOLID_FILL,FUNDAL);
                 x1=stanga+latura*(coloana-1); y1=sus+latura*(linia-1);
                 x2=x1+latura; y2=y1+latura;
                 xmijloc=(x1+x2)/2; ymijloc=(y1+y2)/2;
                 bar(xmijloc-20,ymijloc-20,xmijloc+20,ymijloc+20);
                 // afisez cerc rosu aprins
                 setcolor(LIGHTRED); setfillstyle(SOLID_FILL,LIGHTRED);
                 fillellipse(xmijloc,ymijloc,18,18);
               }
            else
            if (TablaDeJoc[linia][coloana]==1)
               {
                 TablaDeJoc[linia][coloana]=2;
                 setcolor(FUNDAL); setfillstyle(SOLID_FILL,FUNDAL);
                 x1=stanga+latura*(coloana-1); y1=sus+latura*(linia-1);
                 x2=x1+latura; y2=y1+latura;
                 xmijloc=(x1+x2)/2; ymijloc=(y1+y2)/2;
                 bar(xmijloc-20,ymijloc-20,xmijloc+20,ymijloc+20);
                 // afisez un patrat galben
                 setcolor(LIGHTRED); setfillstyle(SOLID_FILL,YELLOW);
                 bar(xmijloc-20,ymijloc-20,xmijloc+20,ymijloc+20);
               }
            else // 2-> 0
            {
                 TablaDeJoc[linia][coloana]=0;
                 setcolor(FUNDAL); setfillstyle(SOLID_FILL,FUNDAL);
                 x1=stanga+latura*(coloana-1); y1=sus+latura*(linia-1);
                 x2=x1+latura; y2=y1+latura;
                 xmijloc=(x1+x2)/2; ymijloc=(y1+y2)/2;
                 bar(xmijloc-20,ymijloc-20,xmijloc+20,ymijloc+20);
            }
            afiseazaScor();
        }
    }
}

void desen()
{
   int i,j; numar=5;
   width=400; height=400; latura=width/numar;
   sus=(getmaxy()-width)/2; stanga=(getmaxx()-height)/2;
   setbkcolor(FUNDAL); clearviewport(); setcolor(BLUE);
   for(i=1; i<=numar; i++)
       for(j=1; j<=numar; j++)
          rectangle(stanga+latura*(i-1),
                    sus+latura*(j-1),stanga+latura*i,sus+latura*j);
}

int main()
{
   initwindow(800,600);
   scor=0; desen(); afiseazaScor();
   gata=false;
   do
   {
      punerePiesa();
   }
   while (!gata);
   getch();
   closegraph();
   return 0;
}

 

Concret si abstract

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

Diamant cu romburi

Azi, 24 noiembrie, la grupele B am început să ne jucăm cu geometrie analitică și grafică.

Astfel, am desenat „diamante cu romburi” sau „diamante cu pătrate”, mai exact niște figuri definite recursiv. Aceste figuri au avut nevoie de funcțiile suplimentare „romb” și „patrat”, pe care le-am făcut plecând de la primitiva grafică de segment de dreaptă, dată de funcția predefinită „line”.

Programul de mai jos conține și funcția „diamant cu cercuri”, care folosește funcția predefinită „circle”.

#include <iostream>
#include <graphics.h>
#include <winbgim.h>

#include <cmath>

void romb(int x, int y, int L)
{
    // aici L este diagonala
    int L2=L/2;
    line(x-L2,y,x,y-L2);
    line(x,y-L2,x+L2,y);
    line(x+L2,y,x,y+L2);
    line(x,y+L2,x-L2,y);
}

void diamantRomburi(int x, int y, int L)
{
    int L2=L/2;
    if (L>10)
    {
        romb(x,y,L);
        diamantRomburi(x-L2,y,L2);
        diamantRomburi(x+L2,y,L2);
        diamantRomburi(x,y-L2,L2);
        diamantRomburi(x,y+L2,L2);
    }
}

void patrat(int x, int y, int L)
{
    // aici L este latura
    int L2=L/2;
    line(x-L2,y-L2,x+L2,y-L2);
    line(x+L2,y-L2,x+L2,y+L2);
    line(x+L2,y+L2,x-L2,y+L2);
    line(x-L2,y+L2,x-L2,y-L2);
}

void diamantPatrate(int x, int y, int L)
{
    int L2=L/2;
    if (L>10)
    {
        patrat(x,y,L);
        diamantPatrate(x-L2,y-L2,L2);
        diamantPatrate(x+L2,y-L2,L2);
        diamantPatrate(x-L2,y+L2,L2);
        diamantPatrate(x+L2,y+L2,L2);
    }
}

int main()
{

    // initializarea ferestrei grafice cu 800 pixeli pe orizontala si 600 pe verticala
    initwindow(800,600);

    // desenam un diamant cu romburi
    diamantRomburi(400,300,200);
    // stergerea ferestrei grafice, dupa apasarea unei taste oarecare
    getch();
    clearviewport();
    // desenam un diamant cu patrate
    diamantPatrate(400,300,200);
    // stergerea ferestrei grafice, dupa apasarea unei taste oarecare
    getch();
    clearviewport();
    // inchiderea ferestrei grafice, dupa apasarea unei taste oarecare
    getch();
    closegraph();
    return 0;
}