Arhive categorie: Grafică

Concurs pe echipe grupa A, 30.03.2019

Un nou concurs la cercul de informatică

Concursul se va organiza pe echipe. Va fi organizat pe 30 martie 2019, începând cu ora 14.00. Va dura până la ora 17.30.

La concurs pot participa echipe de 2-4 persoane din grupa A.

Atenție! Participarea la acest concurs vă aduce 3 puncte, ceea ce 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 în luna mai (cel mai probabil pe 10, 11 sau 12 mai).

 

Premiile acordate

Premiile vor fi acordate de Asociația EduSoft și compania ISSCO din Bacău.

  • Premiul I: 380 lei + excursie gratuită
  • Premiul II: 350 lei + excursie gratuită
  • Premiul III: 330 lei + excursie gratuită
  • Mentiune: 300 lei (se vor acorda 2 mentiuni) + 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: 3p
  • 1 subiect la nivelul materiei parcurse la școală, la clasa a X-a: 2p
  • 1 subiect de grafică, la nivelul a ceea ce s-a predat la cercul de informatică: 4p

Echipe înscrise în concurs

Până acum s-au înscris în concurs următoarele echipe. Dacă apar modificări, semnalați-le Marei (Alexandra Mara Smău: https://www.facebook.com/alexandra.smau.5)

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

Echipa 2: noIdea

  1. Bereșteanu Alexandra, C. N. “Gheorghe Vranceanu” Bacău
  2. Cristea-Eduard Petru, C. N. “Gheorghe Vranceanu” Bacău
  3. Rotaru Radu-Andrei,  C. N. “Gheorghe Vranceanu” Bacău

Echipa 3: Lvl. 35 CodeBusters

  1. Stan Raluca, C. N. “Gheorghe Vranceanu” Bacău
  2. Lungu-Mihai Adelin, “Gheorghe Vranceanu” Bacău
  3. Moisă Victor-Gabriel, “Gheorghe Vranceanu” Bacău

Echipa 4: 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

Echipa 5: 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 6: noname

  1. Babiuc Daria, C. N. Catolic “Sf Iosif” Bacau
  2. Coman Marian-Constantin, C. T. “Dimitrie Ghika” Comănești
  3. Sescu Denis, C. N. “Gheorghe Vranceanu” Bacau

Echipa 7: 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

Juriu

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)

Membri:

  1. Alice Hîncu (cl. a XI-a, C. N. „Gheorghe Vrănceanu” Bacău)
  2. Mihai Nejneriu (cl. a XI-a, C. N. „Vasile Alecsandri” Bacău)
  3. Ștefan Butacu (cl. a XI-a, C. N. „Gheorghe Vrănceanu” Bacău)
  4. Maria Pătrar (cl. a X-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);
    }
}

void diamantCercuri(int x, int y, int L)
{
    // L este raza cercului
    int L2=L/2;
    if (L>10)
    {
        circle(x,y,L);
        diamantCercuri(x-L2,y,L2);
        diamantCercuri(x+L2,y,L2);
        diamantCercuri(x,y-L2,L2);
        diamantCercuri(x,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();
    // desenam un diamant cu cercuri
    diamantCercuri(400,300,200);
    // inchiderea ferestrei grafice, dupa apasarea unei taste oarecare
    getch();
    closegraph();
    return 0;
}