Arhive lunare: noiembrie 2018

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;
}

 

Pregătire specială pentru bacalaureat

Elevii interesați din clasa a XII-a pot participa, în cadrul cercului de informatică „Programare cu răbdare” la câteva ședințe de pregătire specială pentru bacalaureat, unde vor fi abordate următoarele teme:

  • 5 ianuarie 2019 – vectori
  • 12 ianuarie 2019 – matrice
  • 19 ianuarie 2019 – șiruri de caractere

Și elevii din clasa a XI-a se pot înscrie la aceste activități.

 

 

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.

Ghid de instalare Unity 3D

Ghid instalare UNITY 3D (Windows/Mac OS)
1. Accesati aceasta pagina: https://unity3d.com/get-unity/download
2. Selectati “Choose your Unity + download”


3. Din coloana “Personal/For Beginners” selectati “Try Personal”

4. Daca sunteti de acord cu “Terms of Service”, bifati casuta si puteti continua cu descarcarea unei utilitar de tip .exe care sa instaleze Unity.
! Daca folositi Mac OS, aveti posibilitatea la acest pas sa descarcati alt utilitar.


5. Odata finalizata instalarea, se va deschide utilitarul si dati next.


6. Bifati casuta si continuati cu next.

7. Bifati componentele ca in imagine (“Unity 2018, Documentation, Microsoft Visual Studio Community 2017”) si continuati cu next.


8. Cand porniti Unity, va create cont sau va logati folosind Google/Facebook.

9. Selectati Unity Personal si continuati cu Next.


10. Selectati ultima varianta “I don’t use Unity in a professional capacity” si continuati cu Next.


11. Completati surveyul, avand grija sa selectati “Student” ca si primary use pt Unity.


You’re all set ! Ne vedem la workshop!

Irina vă va învăța despre jocurile video

Irina Mădălina Bejan va veni sămbăta, 8 decembrie 2018, pentru toți cei interesați de gaming și de crearea de jocuri pe calculator. Ea va dezvolta cu voi jocuri 3D folosind un game-engine numit Unity 3D, în care se programează în C#, un limbaj de programare foarte apropiat de C++.

Cursul va dura 4 ore. Irina îi roagă pe cei interesați de cursul de jocuri video să vină pregătiți cu laptop-ul, pe care să fie instalat deja Unity 3D. De asemenea, un stick de Internet sau un telefon pe post de hot-spot ar fi necesar.

Legat de Unity 3D, Irina a elaborat un ghid de instalare, pe care îl puteți vizualiza aici:

Ghid de instalare Unity 3D

sau îl puteți descărca în format PDF de aici: install_unity

Irina se prezintă pe Facebook ca fiind:

 

Ce e important si ce nu in programare

Un articol mai vechi (din 1998) despre algoritmi şi programe, despre limbaje şi medii de programare şi despre cum alegem un mediu de programare. Multe din cele scrise aici sunt încă valabile.

Dacă înlocuieşti stiloul cu pana, nu ajungi poet.

E mai mult decât evident! Au fost atâţia scriitori care au scris noaptea, la lumina lumânării şi cu pană şi au lăsat omenirii opere literare de mare valoare. Aşa cum un amator netalentat poate folosi stiloul cu peniţa de aur cel mai scump sau chiar calculatorul şi imprimanta şi să nu realizeze nimic valoros din punct de vedere literar. Aşa stau lucrurile şi în programare. Poţi apela la un mediu de programare foarte performant şi să nu poţi realiza nimic valoros, sub aspect informatic, pe când – poate – folosind un mediu de programare mai puţin dezvoltat, să realizezi programe care să-i încânte pe toţi. Mediul de programare este pentru programator, precum pana sau stiloul pentru scriitor. Iar programul este precum un roman sau o poezie.

Fireşte, dacă foloseşti un toc a cărui peniţa o înmoi mereu în călimară cu cerneală, poţi avea diverse probleme. Poate că din greşeală răstorni călimară şi pătezi tot ce ai scris sau poate peniţa va scrie în unele locuri mai îngroşat, iar în altele mai subţire. Asta, însă, nu va afecta nicicum valoarea operei literare şi nu va schimbă cu nimic opinia criticilor despre ea. Dacă scriitorul va folosi un stilou cu rezerve de cerneală sau multe din problemele sale se vor rezolva. Dacă va apela la un calculator, va putea corectă cu uşurinţă greşelile, adaugă noi fragmenet de text printre cele scrise deja şi va putea imprimă lucrarea folosind caractere diferite. Va lucra mult mai comod, deci schimbarea instrumentului este în favoarea scriitorului şi nu a cititorului. Aşa se întâmplă şi cu programele. Folosind medii de programare avansate, programatorul îşi va uşura o importantă parte din muncă să, dar pentru a veni în întâmpinarea „cititorilor” sau, va trebui să dea dovadă de mult talent, de multă pricepere şi imaginaţie, pentru că „opera” să să fie deosebită şi să răspundă cerinţelor beneficiarilor.

Ce este algoritmul? De ce trebuie sa inveti sa sofezi in general si nu sa conduci Dacia?

Pentru că dacă înveţi să conduci Dacia, s-ar putea să nu te descurci decât cu autoturismul Dacia, eventual pe un alt model, dar nu şi pe o maşină la volanul căreia nu te-ai aşezat niciodată. Să presupunem că într-o bună zi vei avea un Mercedes. Dacă vei stăpâni tehnică şofatului în general şi nu vei învaţă pe de rost câteva comenzi de la maşină Dacia, vei reuşi să te adaptezi cu uşurinţă noului tău autoturism şi, fără experienţă prea mare la volanul sau, vei putea, în câteva zile, să conduci acest Mercedes aşa cum conduceai Dacia.

Programarea se rezolva cu rezolvarea de probleme. Fireşte, nu orice gen de probleme, ci acelea care operează cu informaţii şi pot fi modelate pe calculator. Dacă nu ştim o metodă generală de rezolvare a problemelor, ci doar un număr de rezolvări de probleme particulare, nu vom putea să ne descurcăm cu uşurinţă în situaţii noi. Noi trebuie să stăpânim tehnică rezolvării de probleme de programare şi nu să învăţăm pe de rost cum se rezolva problema X sau problema Y. Dacă ştim să realizăm un program prin care să desenăm, pe ecranul calculatorului, un pătrat roşu şi un pătrat verde nu trebuie să fim mulţumiţi! Trebuie să vedem cum putem desena un pătrat de orice culoare şi în orice poziţie a ecranului. Adică să determinăm algoritmul de rezolvare a problemei desenării pătratelor.

Algoritmul nu este altceva decât o metodă de rezolvare a unei clase de probleme, adică a unor probleme foarte asemănătoare între ele. În general aceste probleme diferă între ele prin dimensiunea lor, exprimată adesea printr-un număr natural n. Pentru a înţelege mai bine, vom exemplifică. Mai întâi, vom consideră două probleme foarte asemănătoare.

Să considerăm că avem un pahar cu vin şi unul cu suc şi un pahar gol. Pentru a interschimba conţinutul primelor două pahare, putem turna vinul în paharul al treilea. Acum primul pahar este gol şi putem turna în el conţinutul celui de-al doilea pahar, adică sucul. Paharul al doilea devine gol şi turnând din paharul al treilea în el, vom avea aici vinul.

A două problema este exact că prima, doar că în loc de vin şi suc avem apă şi bere. Fireşte, problema se rezolva la fel. În general, pe programator nu-l interesează ce se găseşte în cele două pahare, el pur şi simplu doreşte să găsească metodă de interschimbare a conţinuturilor celor două pahare, pur şi simplu. Astfel, din punct de vedere informatic, cele două probleme prezentate mai sus nu şut două probleme de programare diferite, ci doar una. Asta deoarece informaticianul nu ia niciodată în considerare „conţinuturile paharelor”, deci nu-l (prea) interesează valorile datelor pe care le prelucrează. Pentru el e foarte puţin important dacă în cele două pahare se află vin, bere, suc sau chiar acid clorhidric sau sulfuric. Lucruri esenţiale pentru cei ce utilizează un program pot fi fără nici o importantă pentru programator!

Citește și  Cetatea de Scaun a Sucevei – o bijuterie culturală în nordul Moldovei

Spuneam, totuşi, că în general problemele rezolvate de acelaşi algoritm diferă printr-un număr natural n. Astfel, în cele două cazuri de mai sus avem de a face cu o singură problema de informatică, care se numeşte interschimbarea valorilor a două variabile. Nu se poate spune despre cele două probleme că formează o clasa de probleme, dar să dăm un alt exemplu.

Mai multe persoane candidează la un concurs de admitere la un liceu sau la o facultate. Candidaţii pot fi aranjaţi în ordinea descrescătoare a mediilor sau în ordinea alfabetică a numelor lor sau în funcţie de orice alt criteriu. Candidaţii pot fi oricâti, fie 100, fie 2000 fie chiar mai mulţi, deci putem notă numărul lor cu n. Acum avem de a face cu o clasa de probleme, care pot fi rezolvate prin acelaşi algoritm. Dacă vom găsi metodă generală de rezolvare, adică algoritmul, vom şti să aranjăm 100 candidaţi, descrescător după note, sau 2000 de candidaţi, în ordine alfabetică.

Aşadar, algoritmul este o metodă generală de rezolvare a unei clase de probleme. Nu este de ajuns. Există multe asemenea metode de rezolvare, dar trebuie să le considerăm doar pe cele care se termină într-un timp finit, sau într-un timp util pentru noi. De asemenea, esenţial este faptul că un algoritm să fie descris clar, fără ambiguităţi, pentru a putea fi înţeles de oricine.

Cum am putea descrie o metodă de rezolvare a unei probleme aşa încât să poată fie înţeleasă exact de către oricine? Sunt mai multe cai, dar folosind limba română, sau engleză sau orice altă limba naturală, vorbită, este posibil că să nu fim înţeleşi de toată lumea şi întotdeauna. Cu atât mai mult de către un calculator, care nu este atât de inteligent încât să înţeleagă o limba naturală. El poate învaţă o limba (un limbaj) simplu, cu un vocabular redus şi cu puţine reguli de sintaxa, dar pe care trebuie să le învăţăm (şi noi şi el) şi să le respectăm cu mare rigurozitate.

În limbajul natural pot apărea ambiguităţi. Un exemplu este celebra frază „Am văzut un om pe deal cu un telescop”. Această frază poate fi înţeleasă în trei feluri: „Folosind un telescop, am văzut un om, care era pe deal.”, „Am văzut pe dealul pe care era un telescop, un om” sau „Am văzut pe deal un om, care avea un telescop la el”.

Limbajul natural a fost folosit cu mult succes de învăţătoarea noastră, atunci când ne-a învăţat adunarea şi scăderea numerelor, cu mai multe cifre (numerele, nu învăţătoarea!) Când am învăţat scăderea, ne-a spus să aşezăm numerele unul sub altul şi e foarte probabil că toată lumea a înţeles că trebuie să aşeze al doilea număr (scăzătorul) sub primul (descăzutul) şi nu invers. Apoi ne-a explicat că trebuie să scădem cifra din cifra, iar când nu ne ajunge să ne „împrumutăm” de la cifra din dreapta. Noi am înţeles, mai repede sau mai târziu, cum se procedează, care cifra din care se scade, de la cine ne împrumutăm. Am reuşit să învăţăm din două motive: pentru că suntem inteligenţi (iar calculatorul, atenţie!, nu este) şi pentru că am exersat pe mai multe exemple (ceea ce nu se pune problema în cazul calculatorului).

Astfel, pentru a nu apărea ambiguităţi, vom reprezenta algoritmii folosind limbaje artificiale, create de om, că să vină în sprijinul calculatorului. Cele mai folosite modalităţi de reprezentare ale algoritmilor sunt limbajele pseudocod şi schemele logice. Despre ele se discuta în manualul de informatică.

Ce este programul? Ce este un limbaj de programare?

Nu e de ajuns să găseşti un algoritm pentru a rezolva o anumită problema. Trebuie să-l şi descrii, adică să-l reprezinţi. Cel mai bine este să foloseşti totuşi, un limbaj de programare, adică un limbaj de compromis între om şi calculator. Programul este, practic, reprezentarea într-un asemenea limbaj a unui algoritm. Dacă vrei că algoritmul tău să poată fi înţeles uşor de multă lume, care ştie sau nu ştie un limbaj de programare sau altul, este bine să apelezi la limbajele pseudocod. Ele seamănă mult cu limbajele de programare, dar au mai puţine restricţii sintactice şi oferă mai multă libertate programatorului.

Citește și  Despre încredere

Dar cel mai bine este să scrii direct programul, folosind un limbaj sau altul de programare, adecvat problemei pe care doreşti să o rezolvi prin respectivul algoritm. În general, programatorii ştiu să „citească” un program scris într-un limbaj de programare pe care nu-l cunosc, deoarece limbajele de programare seamănă mult între ele, sunt cam la fel gândite şi realizate. Seamănă între ele mai mult decât limbile vorbite. Există, fireşte, şi limbaje de programare speciale, care nu se aseamănă cu celelalte, dar sunt mai puţine şi nu ne vom referi la ele în această lucrare.

Pascal, C, C++, Java, Basic sunt limbaje de programare. Ele au fost inventate de oameni, cu creionul pe hârtie. E că şi cum ai inventa tu acum o limba nouă. Inventezi câteva cuvinte (care să definească substantive, verbe, adjective), apoi reguli de scriere, de sintaxa a propoziţiei şi a frazei şi înţelesurile (semantică) unor asemenea construcţii gramaticale. Asta nu înseamnă că cineva va şti să şi vorbească limba inventată de ţine!

Ce este un mediu de programare?

Aşa stau lucrurile şi cu Pascal, C, C++ şi celelalte. Ele au fost inventate de oameni că Niklaus Wirth, Denis Ritchie, Bjarne Stroupstroup, dar apoi a trebuit să se realizeze implementări ale lor. Adică nişte programe speciale (scrise în alte limbaje de programare, mai vechi şi mai primitive) care puse pe calculator să ştie să înţeleagă (compileze sau interpreteze) un text (program) în Pascal, C, C++ etc. O implementare a unui limbaj de programare devine un mediu de programare. Dar un mediu de programare de astăzi are mult mai multe funcţii decât cea principala, de interpretare şi executare a programului scris de noi. Un mediu de programare modern te ajută să depanezi programul realizat, să-i schimbi ordinea de execuţie a instrucţiunilor din el, să vizualizezi diferite aspecte legate de datele de intrare, de rezultate sau să realizezi o serie de prelucrări necesare bunei funcţionari a programului. De asemenea, un mediu de programare vine cu modificări şi îmbunătăţiri la limbajul de programare de baza, standard.

Turbo Pascal, Delphi sunt medii de programare bazate pe limbajul Pascal, C++ Builder şi Visual C++ sunt medii de programare bazate pe limbajele C şi C++, iar Visual Basic este un mediu de programare bazat pe limbajul Basic.

Concluzie! Cine ştie să sofeze poate conduce un Mercedes!

Aşadar, am plecat de la problema de programare. Ea prelucrează informaţii pentru a obţine altele. Pentru a rezolva o problema (şi toate asemenea ei), avem nevoie de un algoritm. Că algoritmul să fie descris fără ambiguităţi şi să fie înţeles de un calculator, cel mai bine este să folosim un limbaj de programare adecvat. Algoritmul devine program. Pentru că totul să meargă repede, frumos şi bine şi că să punem programul la lucru, vom folosi un mediu de programare corespunzător.

Limbajele de programare sunt cu sutele, iar mediile de programare cu miile. Fiecare mediu de programare se comercializează împreună cu o carte groasă, numită documentaţia să, în care este descris şi nimeni nu va putea să ştie pe de rost tot ce este acolo, nici măcar cei care au creat mediul de programare şi au scris cartea. Nici nu trebuie să-ţi baţi capul prea mult cu asta. Tu trebuie să ştii să rezolvi probleme, deci să elaborezi algoritmii potriviţi problemei date. Vei alege apoi cu mare uşurinţă limbajul de programare şi mediul de programare adecvat şi te vei adapta la momentul potrivit lui. Nu vei putea ţine niciodată pasul cu evoluţia impresionantă a tehnologiei din ultimii ani, de aceea nici nu trebuie să-ţi baţi capul cu noile medii de programare care apar pe piaţă. Ele sunt simple produse comerciale, mai mult sau mai puţin performanţe. Tu învaţă baza, adică să programezi, ceea ce înseamnă în primul rând să rezolvi probleme şi să elaborezi algoritmi. Cine ştie să sofeze va putea să conducă şi cel mai sofisticat Mercedes!

Bogdan Pătruţ

Ferma politica despre noi

Ionut Avram a anuntat in site-ul sau “Ferma politica” lansarea cercului de informatica “Programare cu rabdare”, inca din 4 noiembrie 2018:

Meseria prezentului și a viitorului, asta de programator, Salarii decente spre mari, posibilitate de dezvoltare pe toate planurile, șansa de a lucra pentru niște coloși din domeniul IT, marea șansă de a lucra într-un oraș normal la cap din România sau din vest. Primii pași în acest domeniu se fac în perioada adolescenții.

Link articol complet: https://fermapolitica.ro/2018/11/04/programare-cu-rabdare-cerc-de-it-la-colegiul-vranceanu/

Test de evaluare grupele B

În prima săptămână cei de la grupele B au primit următorul test inițial. Le recomand și celor din celelalte grupe să încerce să-l rezolve.

PROGRAMARE CU RĂBDARE

Test grupa B – Proiecte

Trebuie să rezolvați cel puțin câte o problemă din fiecare categorie.

Categoria 1:

  1. Anii bisecți sunt divizibili cu patru, dar nedivizibili cu 100, cu excepția anilor divizibili prin 400. Astfel, anii 1900 și 2019 nu sunt bisecți, dar anii 2000 și 2016 sunt bisecți.Care dintre următoarele expresii C/C++ testează dacă valoarea variabilei n desemnează un an bisect?
    • (n%400<1)||(n%4==0)&&(n%100!=0)
    • (n%100!=0)&&(n%400==0)||(n%4==0)
    • (n%100!=0)&&(n%4==0)
    • (n%4==0)&&(n%100!=0)&&(n%400==0)
  1. Variabilele u, v, z, t memorează valori întregi astfel încât u < v și z < t. Precizează care dintre expresiile C/C++ de mai jos, atunci când este adevărată, implică faptul că intersecția intervalelor [u, v) și (z, t] este nevidă.
    • (u > t) && (v > z)
    • !((u > t) || (v > z))
    • (u <= t) && (v == z)
    • !((u > t) || (t > u))

Categoria 2:

  1. Fie x o variabilă întreagă care conține cel mai mic număr natural nenul, multiplu de 36, divizibil cu toate numerele prime mai mici decât 10. Precizați care dintre expresiile C/C++ de mai jos este adevărată.
    • (x<1000) && (x % 27 == 0)
    •  (x>1000) && ((x*x*x) % 1000 == 0)
    • ((x*x) / 16) % 2 == 0
    • (x % 100 == 0) || (x / 100 == 0)
  1. Pentru a reprezenta în limbajul C/C++ relațiile de prietenie dintr-un grup de oameni se folosesc următoarele definiții de date:
struct gr {
    int nrPers;
    int priet[50][50]; 
} om;

cu semnificația că în câmpul nrPers stocăm numărul de persoane din grup, iar priet[i][j] poate avea valoarea 1 (semnificând că omul cu numărul i este prieten cu omul cu numărul j), respectiv 0 (în caz contrar). Relația de prietenie se consideră reciprocă.

Cerințe:

a) Care din următoarele secvențe de atribuiri descrie în C/C++ faptul că oamenii cu numerele de ordine 3 și 5 devin prieteni.

a) om.priet[3][5]=1;
om.priet[5][3]=1;
b) gr.priet[3][5]=1;
gr.priet[5][3]=1;
c) priet.om[3][5]=1;
priet.om[5][3]=1;
d) priet.gr[3][5]=1;
priet.gr[5][3]=1;

b) Scrieți o secvență de cod C/C++ prin care puteți atribui variabilei întregi numarMaxim numărul maxim de relații de prietenie care pot exista în grupul definit mai sus.

Categoria 3:

  1. O tablă albă are p simboluri “A” și m simboluri “B” scrise pe ea. Poți alege oricare două simboluri pentru a le șterge și înlocui cu altul, în conformitate cu următoarele reguli
  • AA ⇒ B
  • AB sau BA ⇒ A
  • BB ⇒ B

Dacă vei continua să aplici aceste reguli de înlocuire cât mai mult timp posibil, ce valori ar trebui să aibă p și m ca la final să rămână un singur “A”?

  1. Un robot este poziționat în locul marcat cu o săgeată în harta de mai jos, având orientarea către susul paginii. Robotul poate să interpreteze următoarele comenzi:

nI = mergi n pătrățele înainte

S/D = rotește-te cu 90 de grade la stânga/dreapta

n(commenzi) = execută comenzile dintre paranteze de n ori

O secvență de comenzi care va deplasa robotul din locația săgeții cu în fața stației C este:

  • 2I + 2(8I + D) + D + 2(4I + S)
  • 6I + 2(4I + S) + 5I + D + 3I + S
  • 6I + 2(4I + S) + 5I + 2(D) + 2I + D
  • 2I + 2(8I + D) + D + 2I + 4I + S

 Categoria 4:

  1. Considerăm un alfabet A format dintr-o mulțime finită de caractere. Un cuvânt este o secvență nevidă de caractere distincte din A. Lungimea unui cuvânt este numărul de caractere din care acesta este format. Un p-sistem (p ≥ 1) este definit ca o mulțime S de cuvinte, toate de lungime p, având proprietățile:

(P1) oricare două cuvinte din S au exact un caracter comun

și

(P2) orice caracter din alfabetul A apare în cel puțin un cuvânt din S.

Exemplu: Pentru A = {’a’, ’b’, ’c’}, mulțimea S = {”ab”, ”ac”} este un 2-sistem.

Scrie un 3-sistem peste alfabetul A = {’a’, ’b’, ’c’, ’d’, ’e’, ’f’}.

  1. O matrice cu 8 linii, formată doar din 0 și 1, are următoarele trei proprietăți:

(i) prima linie conține un singur element cu valoarea 1,

(ii) linia j conține de două ori mai multe elemente nenule decât linia j −1, pentru orice
j ∈{2,3, . . . , 8},

(iii) ultima linie conține un singur element cu valoarea 0.

Care este numărul total de elemente cu valoarea 0 din matrice?

  1. 777
  2. 769
  3. 528
  4. nu există o astfel de matrice.

Categoria 5:

  1. O rețea de comparatori de tip n (n ≥ 2) și de dimensiune m (m ≥ 1) este o secvență (c1, c2, . . . , cm) în care fiecare element cm, numit comparator, este o pereche de numere întregi (j, k) cu proprietatea 1 ≤ j < kn.

Exemplu: Rețeaua R = ((1, 2),(2, 3)) are tipul 3 și dimensiunea 2.

Daca a este un vector de n numere întregi și R este o rețea, notăm cu R(a) vectorul obținut aplicând următoarele transformări lui a:

pentru fiecare comparator ci = (j, k), 1 ≤ im din R, în ordinea în care aceștia apar în rețea, dacă a[j] > a[k] atunci în vectorul a interschimbăm valorile de la pozițiile j și k.

Exemplu: Pentru R = ((1, 2),(2, 3)) și a = (30, 20, 10) avem R(a) = (20, 10, 30).

Cerințe:

a) Fie R = ((2, 4),(1, 2),(3, 4),(2, 3)) și a = (40, 30, 20, 10). Calculați R(a) și scrieți valorile intermediare ale vectorului a corespunzătoare transformărilor efectuate.

b) Dați exemplu de o rețea R de tip 4 cu proprietatea că pentru orice vector a format din 4 numere întregi distincte, R(a) va avea elementele ordonate crescător. Justificare.

  1. Se consideră algoritmul de mai jos. S-a notat cu x%y restul împărţirii numărului întreg x la numărul întreg nenul y şi cu [a] partea întreagă a numărului real a.
  2. a) Scrieți ce se va afișa dacă se citește 18?
  3. b) Dați exemplu de un număr natural n<100, astfel încât algoritmul să afișeze 6.
  4. c) Scrieți algoritmul sub forma unei funcții recursive echivalente (în pseudocod sau în C/C++)
citește n
p¬0
┌cât timp n>0 execută
│   ┌dacă n%3 = 0 atunci
│   │     n¬ [n/3]
│   │altfel
│   │    ┌dacă n%2 = 1 atunci
│   │    │     n¬ [n/2]
│   │    │altfel
│   │    │     n¬n-1
│   │    └■
│   └■
│    p¬p+1
└■
scrie p

 

Instalarea bibliotecii grafice 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.hwinbgim.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 (x86)\CodeBlocks\MinGW\include\)
    (sau aici c:\Program Files (x86)\CodeBlocks\MinGW\include\ sau aici: C:\MinGW\include)
  3. Copiati fisierul libbgi.a in folderul lib al directorului compilatorului MinGW, care se gaseste, cel mai probabil, aici: c:\Program Files (x86)\CodeBlocks\MinGW\lib\ 
  4. (sau aici c:\Program Files (x86)\CodeBlocks\MinGW\lib\ sau aici: C:\MinGW\lib)
  5. In Code::Blocks accesati Settings >> Compiler… >> linker settings
  6. Faceti click pe butonul Add in partea Link libraries, apoi rasfoiti si selectati fisierul libbgi.a
  7. In partea dreapta (adica la Other linker options) scrieti urmatoarele comenzi:
    -lbgi -lgdi32 -lcomdlg32 -luuid -loleaut32 -lole32
  8. Faceti click pe OK.

Descrierea funcțiilor grafice se găsește 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;
}

Dacă acesta functionează, puteți continua să folosiți orice funcție grafică și de lucru cu mouse-ul din biblioteca WinBGIm.

Succes!

Instalare corectă Code::Blocks

Bună!

Azi la grupa B3 am observat că mai mulți elevi nu aveau instalat bine pe propriul laptop Code::Blocks. Motiv pentru care a fost destul de greu sau chiar imposibil ca să lucrăm cu biblioteca grafică WinBGIm.

Ca totul să fie OK, iată ce să faceți:

  1. Dezinstalați (din Control Panel) CodeBlocks-ul actual, chiar și compilatorul MinGW asociat.
  2. Accesați site-ul ORIGINAL al lui CodeBlocks, la secțiunea Downloads-> Binaries, mai exact mergeți la acest link: http://www.codeblocks.org/downloads/binaries
  3. Accesați exact linkul de la Sourceforge.net, cel indicat cu roșu în figura de mai jos (pentru sistemul de operare Windows)
  4. Acest link vă trimite spre un site, numit Sourceforge.net, de unde se va descărca automat Codeblocks împreună cu compilatorul pentru limbajul C/C++ numit MinGW.
  5. Așteptați câteva secunde, conform indicațiilor din imaginea următoarea…
  6. iar la final, după descărcarea kitului (programul de instalare) lui CodeBlocks+MinGW, salvați-l pe Desktop, de pildă, pentru a putea să accesați kitul de instalare
  7. În timpul instalării, veți fi întrebat(ă) unde să instalați, adică unde va fi calea către mediul vostru de dezvoltare Codeblocks.
  8. Alegeți calea propusă, care va fi de forma:
    C:\Program Files (x86)\CodeBlocks sau C:\Program Files\CodeBlocks

După ce ați rezolvat acest lucru, încercați un proiect simplu, de tip ”Hello World!”, ca să vedeți că funcționează totul corect.

Pentru a executa programe grafice, urmași pașii din postarea următoare:

Click pentru instalare biblioteca grafică WinBGIm.

 

Rezervă-ți ziua de sâmbată, 8 decembrie, pentru a cunoaște trei fete frumoase și inteligente!

Rezervă-ți ziua de sâmbată, 8 decembrie, pentru a cunoaște trei fete frumoase și inteligente: Irina, Ioana și Diana, la cercul de informatică „Programare cu răbdare”.

Irina Madalina Bejan este STEP Intern la Google, Women Techmakers Scholar la Google, Managing Director la Girls Who Code – Iași și Ambassador la Girls in Tech
Irina a fost Research and Development Engineer (R&D Engineer) la Gemini CAD Systems Development Center Iasi, Software Developer la Sprocket, Inc. și toate acestea în timp ce studiază la Facultatea de Informatică din Iași. Irina vă va introduce în programarea jocurilor în Unity 3D, așa că nu ratați ocazia!

Ioana Radulescu, absolventă a Colegiului Național „Ferdinand I” vă poate spune cum a trecut de la a fi profesor de informatică la munca de project manager la Softescu și apoi la Tremend Software Consulting, în București. Până la numai 30 de ani, Ioana a livrat cu succes o serie de proiecte software din diverse arii tehnologice. În prezent se implică in evoluția profesională a colegilor de department prin sesiuni de coaching și coordonează (bine) simultan mai multe echipe de proiect. Ea vă va dezvălui tainele muncii de echipă, în proiectele software, urmând ca la revenirea ei în februarie 2019, să „livrați” în echipe o aplicație concretă de la A la Z, sub îndrumarea ei. Sunteți pe mâini bune!

Diana Tudosă studiază la Facultatea de Matematică și Informatică din București,.iar de curând e junior front-end developer la Tremend Software. Diana a reușit să îmbine pasiunea sa pentru informatică cu cea pentru teatru, încă din liceu mergând pe ambele direcții: a fost membru activ în trupa de teatru “In the Spot”, dar și premiantă la concursul de informatică pentru fete “The Beauty of Code – The Code of Beauty”. Diana vă va arăta cum o problemă la care inițial te gândești că se rezolvă în O(n*n), apoi în O(nlog(n)), ajungi în final să o rezolvi în O(n).

Vedeți că se poate?!

Ce să înveți ca să câștigi bani rapid din web-design?

Cristian Avătavului de la IBM București vine duminică (25 noiembrie, ora 12) la „Programare cu răbdare”, pentru a-i învăța pe cei interesați de web-design cum să faci un site rapid și să câștigi bani.

Așadar, ne întâlnim sâmbătă (24 noiembrie) cu Paul Diac, Simona Elena VarlanTiberiu Socaciu și Arminia Mihail, iar cu Cristian ne vedem a doua zi.

Vei descoperi că poți fi IT-ist și, în același timp, scafandru profesionist, un pasionat de sport și de turism și să ai lângă tine și o femeie superbă.

Vei deveni un nume în informatică!

Da, suntem convinși că vei deveni un expert în programare.

Care sunt secretele unui bun programator?

Vino la cercul nostru de informatică și le vei afla!

Unde? La Colegiul Național „Gheorghe Vrănceanu” din Bacău

Când? În fiecare sâmbătă, de la ora 9.00, începând cu 17 noiembrie 2018

Cu cine? Studenți și profesori de la facultățile de INFO și AC din București, Iași, Cluj și Timișoara, oameni cu experiență la Facebook, Amazon, Microsoft, Twitter etc.

Vei învăța de la oameni cu experiență

  1. cum scrii „cod curat”;
  2. care sunt cele mai potrivite structuri de date pentru un algoritm;
  3. folosirea eficientă a funcțiilor și a recursivității
  4. descompunerea unui proiect în aplicațiile componente;
  5. grafică și proiectarea de jocuri.

Și vei implementa

  1. jocuri între doi jucători (om vs calculator);
  2. editoare grafice de formule matematice sau chimice;
  3. simulatoare grafice pentru diferite fenomene ale naturii;
  4. aplicații de inteligență artificială;
  5. programe pentru prelucrarea limbajului natural și multe altele.

Înscrieri

Pentru a te înscrie accesează acest link și completează formularul

https://goo.gl/forms/jGKG1yTfA1KIe8wE2

Promitem o experiență interesantă în lumea programării.

Între timp, citește articolul renumitului profesor american Peter Norvig: http://norvig.com/romanian21-days.html