SDA Lucrarea 1: Diferență între versiuni

De la WikiLabs
(Realizarea unui proiect)
(Exerciții)
(Nu s-au afișat 31 de versiuni intermediare efectuate de același utilizator)
Linia 17: Linia 17:
 
=== Instalarea GCC în Windows ===
 
=== Instalarea GCC în Windows ===
  
Pentru compilarea de programe cu GCC în Windows, aveți nevoie de instalarea acestui compilator care poate fi făcută prin instalarea unuia din următoarele două pachete:
+
Pentru compilarea de programe cu GCC în Windows, aveți nevoie de instalarea acestui compilator care poate fi făcută prin instalarea unuia din următoarele două suite de programe:
 
* [https://cygwin.com Cygwin] - Tutorial de instalare [https://cygwin.com/install.html aici].
 
* [https://cygwin.com Cygwin] - Tutorial de instalare [https://cygwin.com/install.html aici].
 
* [http://www.mingw.org/ MinGW] - Tutorial de instalare [http://www.mingw.org/wiki/InstallationHOWTOforMinGW aici].
 
* [http://www.mingw.org/ MinGW] - Tutorial de instalare [http://www.mingw.org/wiki/InstallationHOWTOforMinGW aici].
 +
 +
<div class="regula"><span style="color: red; font-weight: bold">Atenție:</span> Nu uitați ca la instalare să bifați în lista de pachete și compilatorul de C (<code>gcc</code>), <code>make</code> și <code>git</code>.</div>
  
 
== Instalarea Netbeans ==
 
== Instalarea Netbeans ==
Linia 60: Linia 62:
 
* '''Tool Collection''' - dacă există mai multe compilatoare instalate, de aici se alege care compilator este utilizat pentru proiect.
 
* '''Tool Collection''' - dacă există mai multe compilatoare instalate, de aici se alege care compilator este utilizat pentru proiect.
  
După ce dați click pe '''Finish''', proiectul se va deschide și fereastra va arăta în felul următor:
+
După ce dați click pe '''Finish''', proiectul se va deschide și fereastra se va schimba în modul de editare.
 +
 
 +
== Componentele IDE-ului Netbeans ==
  
 
[[Fișier:netbeans_env.png|1000px|Netbeans]]
 
[[Fișier:netbeans_env.png|1000px|Netbeans]]
  
= Exerciții =
+
Zonele din imagine sunt:
  
== Exercițiul 1 ==  
+
# Zona <span style="color: gold">gabenă</span> - bara de instrumente - conține butoane folosite pentru acces rapid la funcționalitatea cea mai utilizată (compilare, rulare, etc.) și conține:
 +
#* selecția tipului de compilare ('''Debug''' sau '''Release''') are efect asupra nivelului de optimizare comandat compilatorului și selectează sau nu facă simbolurile de debug sunt adăugate executabilului; pe scurt, nu se poate face debug pe executabilul de Release, dar executabilul de Debug este mai lent decât cel de Release;
 +
#* testare în browser, este accesibil doar pentru aplicații web (HTML, PHP, Javascript, etc.), nu și pentru aplicații C/C++;
 +
#* '''Build Project''' - se apelează '''make all''' pentru compilarea programului;
 +
#* '''Clean and Build Project''' - se apelează '''make clean all''' pentru ștergerea binarelor și apoi recompilarea programului;
 +
#* '''Run Project''' - se rulează executabilul generat de build (dacă acesta nu există sau nu este actualizat, se rulează automat '''Build Project''' înainte);
 +
#* '''Debug Project''' - se rulează executabilul generat de build în modul de debug (cu ajutorul GDB, vezi [[PC Laborator 10#Tool-ul de depanare GDB]]), permițând plasarea de breakpoints, execuție pas cu pas, vizualizarea valorilor variabilelor, etc.
 +
#* '''Profile Project''' - indisponibil în C/C++, permite vizualizarea resurselor consumate și ajută la optimizarea programului.
 +
# Zona <span style="color: blue">albastră</span> - conține 4 tab-uri din care importante pentru proiectele în C sunt primele două: '''Projects''' și '''Files'''.
 +
#* '''Projects''' - arată proiectele deschise și tipul lor; în cazul de față este un singur proiect deschis - '''TestProjectHelloWorld'''; sub el se află 5 categorii în care sunt plasate fișierele care fac parte din proiect:
 +
#** ''Header Files'' - fișierele header (cu extensia .h);
 +
#** ''Resource Files'' - diferite fișiere cu resurse folosite de aplicație (fișiere de configurare, xml, imagini, etc.);
 +
#** ''Source Files'' - fișiere sursă C (cu extensia .c);
 +
#** ''Test Files'' - fișiere de test pentru funcțiile din fișierele sursă;
 +
#** ''Important Files'' - fișiere importante pentru proiect (cum ar fi fișierul Makefile).
 +
#* '''Files''' - se poate vedea directorul proiectului cu fișierele și subdirectoarele sale; în directorul proiectului se realizează implicit următoarele subdirectoare:
 +
#** ''build'' - conține fișierele obiect pentru fiecare din surse, pentru fiecare tip de compilare ('''Debug''' sau '''Release''');
 +
#** ''dist'' - conține fișierele executabile pentru fiecare tip de compilare ('''Debug''' sau '''Release''');
 +
#** ''nbproject'' - conține fișiere de configurare pentru proiect.
 +
# Zona <span style="color: green">verde</span> - conține câte un tab pentru fiecare fișier deschis pentru compilare; implicit bara verde se află deasupra ferestrei de editare (portocaliu) dar poate fi mutată.
 +
# Zona <span style="color: orange">portocalie</span> - fereastra de editare a codului ce conține pe bara de sus butoane pentru navigarea rapidă prin fișierele deschise și / sau modificate recent; de remarcat aici este butonul '''History''' care, dacă fișierul este salvat într-un sistem de ''revision control'' (cum ar fi Git), permite vizualizarea istoriei modificărilor fișierului.
 +
# Zona <span style="color: hotpink">roz</span> - listează elementele definite în fișierul deschis în zona portocalie; dacă fișierul este un header sau un fișier sursă C, aici se vor vedea tipurile de date definite, variabilele globale, funcțiile cu argumentele lor, macrourile de preprocesor, etc.; dacă în schimb este deschis un Makefile, se vor vedea toate rețetele definite în Makefile-ul respectiv;
 +
# Zona <span style="color: red">roșie</span> - zona de ''Output'' reprezintă consola unde se afișează rezultatele compilării cât și ieșirea generată de program în timpul execuției, pe ambele stream-uri (stdout și stderr).
  
Realizați un program care să citească de la tastatură o lungime '''n''', apoi '''n''' numere care să fie stocate într-un vector. Apoi se va citi de la tastatură o valoare '''v''' și se va afișa pe ecran de câte ori apare valoarea '''v''' în vector.
+
== Exemplu de program ==
  
== Exercițiul 2 ==
+
Copiați codul de mai jos înlocuind programul deja existent în fișierul ''main.c'':
 +
<syntaxhighlight lang="C">
 +
#include <stdio.h>
  
Modificați programul de la exercițiul 1 astfel încât citirea datelor și cautarea valorii în vector să fie scrise în funcții diferite.
+
int main(){
 +
    printf("Hello Netbeans!\n");
 +
    return 0;
 +
}
 +
</syntaxhighlight>
  
== Exercițiul 3 ==
+
Dați apoi click pe '''Run Project''' (simbolul verde ''Play'') sau tastați <code>Ctrl+F11</code>:
  
Modificați programul de la exercițiul 2 astfel încât cele două funcții și '''main''' să se afle în fișiere separate.
+
[[Fișier:netbeans_run.png|1000px|După execuție]]
  
== Exercițiul 4 ==
+
Observați consola din partea de jos a ecranului unde se afișează mesajul "Hello Netbeans" și apoi se semnalează sfârșitul programului raportându-se timpul de execuție.
  
Următorul program implementează o sortare de vector dar are o eroare. Utilizați debugger-ul grafic pentru a identifica problema.
+
== Exemplu de program în modul ''debug'' ==
  
<syntaxhighlight lang="C">
+
Copiați codul de mai jos înlocuind programul deja existent în fișierul ''main.c'':
 +
<syntaxhighlight lang="C" line>
 
#include <stdio.h>
 
#include <stdio.h>
  
 
int main(){
 
int main(){
    int vectorLength;
+
     printf("Debugging program...\n");
     printf("Length = ");
+
     int value = 0;
    scanf("%d", &vectorLength);
+
     value = value + 1;
 
+
    value++;
    int vector[vectorLength];
+
    value = value * 2;
     int i;   
+
     value -= 1;
   
+
    printf("Value is now %d!\n", value);
    for(i=0; i<vectorLength; i++){
 
        printf("v[%d] = ", i);
 
        scanf("%d", &vector[i]);
 
    }
 
      
 
 
 
    int temp;
 
    int done;
 
   
 
    do{
 
        done = 1;
 
        for(i=0; i<vectorLength; i++){
 
            if(vector[i] > vector[i + 1]){
 
                temp = vector[i];
 
                vector[i] = vector[i + 1];
 
                vector[i + 1] = temp;
 
                done = 0;
 
            }
 
        }
 
    }while(!done);
 
      
 
    for(i=0; i<vectorLength; i++){
 
        printf("%d, ", vector[i]);
 
    }
 
    printf("\n");
 
 
     return 0;
 
     return 0;
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
  
== Exercițiul 5 ==
+
Dați click pe numărul liniei 5 (în dreptul definiției variabilei <code>value</code>) și ar trebui ca în loc de numărul liniei să vă apară un pătrat roșu. Acela semnalează un ''breakpoint'' la acea linie. Dați apoi click pe '''Debug Project''' sau tastați <code>F11</code>. Acesta va programul în modul de ''debug'' și astfel se va opri la primul ''breakpoint'':
 +
 
 +
[[Fișier:netbeans_debug.png|1000px|După execuție]]
 +
 
 +
În interfață au apărut două zone noi:
 +
# Zona <span style="color: red">roșie</span> - instrumente de control al execuției în modul de debug; în ordine, acestea sunt:
 +
#* '''Finish Debugger Session''' - execuția se încheie și interfața grafică revine la forma anterioară;
 +
#* '''Restart''' - execuția se reia de la începutul programului, oprindu-se la primul ''breakpoint'';
 +
#* '''Pause''' - dacă programul nu este oprit (într-un ''breakpoint''), atunci accesta poate fi întrerupt facând click pe acest buton;
 +
#* '''Continue''' - dacă programul este oprit (într-un ''breakpoint''), atunci el poate fi rulat mai reparte până la următorul ''breakpoint'' cu ajutorul acestui buton;
 +
#* '''Step Over''' - programul va executa linia curentă (inclusiv orice apel de funcție ar fi pe linia curentă) și trece la linia următoare unde se oprește;
 +
#* '''Step Into''' - programul va executa linia curentă iar dacă pe linia curentă există un apel de funcție, se va opri pe prima linie din funcția respectivă;
 +
#* '''Step Out''' - programul va termina de executat funcția curentă și se va opri pe prima linie după linia unde a fost apelată funcția respectivă;
 +
#* '''Run to Cursor''' - programul va executa toate liniile și se va opri pe linia unde este plasat cursorul; dacă acesta nu este plasat în calea execuției programului, acesta se va rula până la final;
 +
#* '''Step Into Last or Selected Function Called From Current Line''' - similar cu '''Step Into''' doar că dacă există mai multe apeluri de funcții pe linia curentă, această opțiune permite selectarea celei în care se va opri programul.
 +
 
 +
# Zona <span style="color: blue">albastră</span> - vizualizarea stării execuției programului; aveți la dispoziție trei taburi noi:
 +
#* '''Variables''' - aici se pot vedea valorile curente ale tuturor variabilelor valide în ''scope''-ul curent al programului; inclusiv aici se pot adăuga ''watches'' care permit vizualizarea valorilor calculate din expresii complexe scrise în limbajul C;
 +
#* '''Call Stack''' - aici se poate vedea în orice moment stiva de execuție a programului;
 +
#* '''Breakpoints''' - aici se poate vedea lista de ''breakpoints'' din programul curent.
 +
 
 +
Pentru a exersa utilizarea sistemului de debug, realizați următoarele operații:
 +
# Parcurgeti tot programul folosind '''Step Over''' și vizualizând valoarea variabilei <code>value</code> la fiecare pas, până la ultima linie din program, unde utilizați '''Continue'''.
 +
# Reporniți aplicația în modul de debug și puneți un al doilea ''breakpoint'' pe linia cu apelul funcției <code>printf</code>.
 +
# Folosiți '''Continue''' pentru a ajunge la al doilea ''breakpoint''.
 +
# Odată ajunși acolo, folosiți '''Step In''' pentru a intra în funcția <code>printf</code> (neavând codul sursă, veți vedea codul de asamblare obținut din dezasamblarea fișierului obiect de către GDB).
 +
# Folosiți '''Step Out''' pentru a reveni în funcția <code>main</code> și apoi '''Continue''' pentru a termina execuția.
 +
# Reporniți aplicația în modul de debug și realizați un ''watch'' cu valoarea lui <code>value + 1</code>. Vizualizați pas cu pas execuția programului.
 +
 
 +
== Tips & Tricks ==
 +
 
 +
=== Suport pentru instrumente de ''Revision Control'' ===
 +
 
 +
Netbeans oferă suport grafic pentru cele mai utilizate intrumente de ''revision control'': SVN, Git, Mercurial, etc. Pentru a crea un repository nou de Git pentru proiectul curent din interfața grafică, puteți da click dreapta pe numele proiectului, apoi '''Versioning -> Initialize Git repository...''':
 +
 
 +
[[Fișier:netbeans_git_init.png|1000px|Git Init]]
 +
 
 +
După operațiunea de init, meniul '''Versioning''' se va schimba în '''Git''', de unde se pot realiza toate operațiile cunoscute din Git: add, remove, commit, push, pull, merge, rebase, diff, etc.
 +
 
 +
=== Formatare automată a codului ===
  
Următorul program calculează factorialul unui număr, dar are o eroare. Utilizați debugger-ul grafic pentru a identifica problema.
+
Netbeans oferă opțiunea de a formata automat codul prin selectarea '''Source -> Format'''.  
  
<syntaxhighlight lang="c">
+
Ce probleme rezolvă această formatare automată:
#include<stdio.h>
+
* alinierea liniilor în funcție de blocurile de instrucțiuni și tipurile de ''statements'' de pe fiecare linie;
 +
* plasarea sau eliminarea de spații acolo unde este necasar.
 +
Ce probleme NU rezolvă această formatare automată;
 +
* lipsa acoladelor de la blocurile '''if''' și '''for''';
 +
* numele insuficient de sugestive pentru numele de funcții, structuri sau variabile.
  
int factorial(int n){
+
Nu uitați de regulile următoare: [[Convenții de cod - C]]
    return n * factorial(n - 1);
 
}
 
  
int main(){
+
<!--
 +
= Exerciții =
  
    int number;
+
*Săptămâna 1
    scanf("%d", &number);
+
*# Realizați un proiect nou în Netbeans și scrieți un program care să citească de la tastatură un număr întreg fără semn <code>size</code>. Se va aloca apoi dinamic în HEAP un vector de <code>size</code> valori numerice întregi pe 16 biți. Scrieți o funcție care să citească <code>size</code> valori de la tastatură și să le plaseze în vector. Scrieți apoi o funcție care să găsească valoarea maximă din vector. Apelați în <code>main</code> funcțiile de mai sus și afișați valoarea obținută pe ecran. Nu uitați să dezalocați memoria alocată. Pentru funcțiile de alocare și dezalocare de memorie, puteți recapitula [[PC Laborator 12]].
   
+
*# Modificați programul de mai sus astfel încât citirea variabilei <code>size</code> cât și alocarea de memorie să fie făcută într-o funcție separată. Această funcție trebuie să întoarcă un pointer cu adresa de început a vectorului dar și dimensiunea acestuia.
    printf("n! = %d\n", factorial(number));
+
*# Realizați un alt proiect în Netbeans și scrieți un program care să citească de la tastatură un șir de caractere de lungime maximă 255. Folosind aritmetica pointerilor și o singură buclă '''for''', afișați pe ecran doar cifrele din șirul citit.
   
+
* Săptămâna 2
    return 0;
+
*# Realizați un proiect nou în Netbeans și scrieți un program care să citească de la tastatură un număr întreg fără semn <code>size</code>. Scrieți apoi o funcție care să aloce memorie pentru un șir de caractere care să conțină de <code>size</code> ori secvența "ha" (spre exemplu, pentru size == 3, string-ul va trebui să conțină "hahaha"), să umple șirul cu numărul cerut de "ha"-uri și să întoarcă adresa memoriei alocate. În funcția <code>main</code> afișați șirul de caractere (nu uitați la alocare de terminatorul de sfârșit de șir). Nu uitați să dezalocați memoria. Pentru funcțiile de alocare și dezalocare de memorie, puteți recapitula [[PC Laborator 12]].
}
+
*# Modificați programul de mai sus astfel încât în loc de secvența "ha", secvența repetată să fie citită de la tastatură cu <code>scanf</code> și trimisă ca argument funcției de alocare.
</syntaxhighlight>
+
*# Realizați un alt proiect în Netbeans și scrieți un program care să citească de la tastatură un șir de caractere de lungime maximă 255. Scrieți o singură funcție care să numere și să întoarcă numărul de litere și numărul de cifre din șirul citit. Aceste valori se vor afișa pe ecran în funcția <code>main</code>.
 +
-->

Versiunea de la data 22 februarie 2017 00:44

După acest laborator veți putea folosi IDE-ul Netbeans pentru a scrie și depana programe în C. Totodată veți relua și recapitula noțiunile legate de pointeri în C.

Utilizarea IDE-ului Netbeans

Netbeans este un mediu integrat de dezvoltare (IDE) open-source și gratuit care permite dezvoltarea de programe în limbajele Java, C, C++, Javascript, HTML, PHP și Groovy. Netbeans nu instalează și compilatoare pentru Java și C/C++, acestea trebuie instalate manual, în prealabil.

Atenție: Imaginea de Linux folosită la Programarea Calculatoarelor are deja instalat compilatorul de C.

Instalarea GCC

Instalarea GCC în Linux

Pentru instalarea compilatorului de C (GCC) în distribuțiile de Linux provenite din Ubuntu (Ubuntu, Kubuntu, Xubuntu, Mint, LMDE, etc.) se poate folosi comanda:

apt-get install -y build-essential

Instalarea GCC în Windows

Pentru compilarea de programe cu GCC în Windows, aveți nevoie de instalarea acestui compilator care poate fi făcută prin instalarea unuia din următoarele două suite de programe:

Atenție: Nu uitați ca la instalare să bifați în lista de pachete și compilatorul de C (gcc), make și git.

Instalarea Netbeans

De la adresa https://netbeans.org/downloads/ puteți descărca kitul de instalare pentru sistemul vostru de operare (imaginea de Virtualbox cu Linux folosită la Programarea Calculatoarelor ruelază un Linux pe 32 de biți). Descărcați una din variantele care suporta C/C++ (C/C++ sau All).

Instalare Netbeans în Linux

Fișierul descărcat pentru Linux va avea extensia .sh. Pentru a instala programul, deschideți un terminal și rulați următoarele comenzi:

cd ~/Downloads # navigare catre directorul unde a fost salvat fisierul descarcat
chmod +x *.sh # activarea fanionului 'executabil' pentru toate fisierele cu extensia .sh
sudo ./netbeans-8.1-cpp-linux-x86.sh # folositi numele corespunzator al fisierului descarcat

Mai departe urmați pașii din programul de instalare.

Instalare Netbeans în Windows

Fișierul descărcat va avea extensia .exe. Rulați-l și urmăriți instrucțiunile. Veți fi întrebați unde este compilatorul de C/C++. Executabilele pentru acestea sunt în directorul unde ați instalat MinGW sau Cygwin, în subdirectorul /usr/bin.

Realizarea unui proiect

Aplicațiile în Netbeans sunt structurate în Proiecte. O aplicație este un proiect. Nu este suficient să scrieți un fișier sursă C și să-l rulați. Netbeans trebuie să creeze fișiere Makefile și să pregătească mediul pentru compilare și execuție precum și să fie capabil să vă ofere informații legate de corectitudinea codului și să vă ofere sugestii de îmbunătățire. Pentru a crea un proiect nou, se folosește meniul File - New Project... sau combinația Ctrl-Shift-n:

Proiect nou

Mai departe selectați categoria C/C++ și la Project selectați C/C++ Application. Va apărea următoarea fereastră:

Aplicație nouă

Completați următoarele informații:

  • Project Name - numele proiectului/ al aplicației voastre; va fi numele directorului creat de Netbeans pentru proiect;
  • Project Location - directorul unde va fi salvat directorul proiectului de către Netbeans;
  • Project Folder - calea completă până la directorul proiectului; este obținut din concatenarea celor două de mai sus; nu poate fi modificat;
  • Project Makefile Name - numele fișierului Makefile care va fi creat de către Netbeans pentru proiectul vostru;
  • Create Main File - se bifează dacă se dorește crearea unui fișier sursă care să conțină funcția main și se completează numele acestui fișier (fără extensie); în căsuța de selecție din dreapta se alege limabjul (C sau C++) și standardul folosit pentru compilarea codului și generarea fișierului main;
  • Build Host - numele sau adresa IP a calculatorului unde se realizează compilarea (localhost este calculatorul pe care lucrați);
  • Tool Collection - dacă există mai multe compilatoare instalate, de aici se alege care compilator este utilizat pentru proiect.

După ce dați click pe Finish, proiectul se va deschide și fereastra se va schimba în modul de editare.

Componentele IDE-ului Netbeans

Netbeans

Zonele din imagine sunt:

  1. Zona gabenă - bara de instrumente - conține butoane folosite pentru acces rapid la funcționalitatea cea mai utilizată (compilare, rulare, etc.) și conține:
    • selecția tipului de compilare (Debug sau Release) are efect asupra nivelului de optimizare comandat compilatorului și selectează sau nu facă simbolurile de debug sunt adăugate executabilului; pe scurt, nu se poate face debug pe executabilul de Release, dar executabilul de Debug este mai lent decât cel de Release;
    • testare în browser, este accesibil doar pentru aplicații web (HTML, PHP, Javascript, etc.), nu și pentru aplicații C/C++;
    • Build Project - se apelează make all pentru compilarea programului;
    • Clean and Build Project - se apelează make clean all pentru ștergerea binarelor și apoi recompilarea programului;
    • Run Project - se rulează executabilul generat de build (dacă acesta nu există sau nu este actualizat, se rulează automat Build Project înainte);
    • Debug Project - se rulează executabilul generat de build în modul de debug (cu ajutorul GDB, vezi PC Laborator 10#Tool-ul de depanare GDB), permițând plasarea de breakpoints, execuție pas cu pas, vizualizarea valorilor variabilelor, etc.
    • Profile Project - indisponibil în C/C++, permite vizualizarea resurselor consumate și ajută la optimizarea programului.
  2. Zona albastră - conține 4 tab-uri din care importante pentru proiectele în C sunt primele două: Projects și Files.
    • Projects - arată proiectele deschise și tipul lor; în cazul de față este un singur proiect deschis - TestProjectHelloWorld; sub el se află 5 categorii în care sunt plasate fișierele care fac parte din proiect:
      • Header Files - fișierele header (cu extensia .h);
      • Resource Files - diferite fișiere cu resurse folosite de aplicație (fișiere de configurare, xml, imagini, etc.);
      • Source Files - fișiere sursă C (cu extensia .c);
      • Test Files - fișiere de test pentru funcțiile din fișierele sursă;
      • Important Files - fișiere importante pentru proiect (cum ar fi fișierul Makefile).
    • Files - se poate vedea directorul proiectului cu fișierele și subdirectoarele sale; în directorul proiectului se realizează implicit următoarele subdirectoare:
      • build - conține fișierele obiect pentru fiecare din surse, pentru fiecare tip de compilare (Debug sau Release);
      • dist - conține fișierele executabile pentru fiecare tip de compilare (Debug sau Release);
      • nbproject - conține fișiere de configurare pentru proiect.
  3. Zona verde - conține câte un tab pentru fiecare fișier deschis pentru compilare; implicit bara verde se află deasupra ferestrei de editare (portocaliu) dar poate fi mutată.
  4. Zona portocalie - fereastra de editare a codului ce conține pe bara de sus butoane pentru navigarea rapidă prin fișierele deschise și / sau modificate recent; de remarcat aici este butonul History care, dacă fișierul este salvat într-un sistem de revision control (cum ar fi Git), permite vizualizarea istoriei modificărilor fișierului.
  5. Zona roz - listează elementele definite în fișierul deschis în zona portocalie; dacă fișierul este un header sau un fișier sursă C, aici se vor vedea tipurile de date definite, variabilele globale, funcțiile cu argumentele lor, macrourile de preprocesor, etc.; dacă în schimb este deschis un Makefile, se vor vedea toate rețetele definite în Makefile-ul respectiv;
  6. Zona roșie - zona de Output reprezintă consola unde se afișează rezultatele compilării cât și ieșirea generată de program în timpul execuției, pe ambele stream-uri (stdout și stderr).

Exemplu de program

Copiați codul de mai jos înlocuind programul deja existent în fișierul main.c:

#include <stdio.h>

int main(){
    printf("Hello Netbeans!\n");
    return 0;
}

Dați apoi click pe Run Project (simbolul verde Play) sau tastați Ctrl+F11:

După execuție

Observați consola din partea de jos a ecranului unde se afișează mesajul "Hello Netbeans" și apoi se semnalează sfârșitul programului raportându-se timpul de execuție.

Exemplu de program în modul debug

Copiați codul de mai jos înlocuind programul deja existent în fișierul main.c:

 1 #include <stdio.h>
 2 
 3 int main(){
 4     printf("Debugging program...\n");
 5     int value = 0;
 6     value = value + 1;
 7     value++;
 8     value = value * 2;
 9     value -= 1;
10     printf("Value is now %d!\n", value);
11     return 0;
12 }

Dați click pe numărul liniei 5 (în dreptul definiției variabilei value) și ar trebui ca în loc de numărul liniei să vă apară un pătrat roșu. Acela semnalează un breakpoint la acea linie. Dați apoi click pe Debug Project sau tastați F11. Acesta va programul în modul de debug și astfel se va opri la primul breakpoint:

După execuție

În interfață au apărut două zone noi:

  1. Zona roșie - instrumente de control al execuției în modul de debug; în ordine, acestea sunt:
    • Finish Debugger Session - execuția se încheie și interfața grafică revine la forma anterioară;
    • Restart - execuția se reia de la începutul programului, oprindu-se la primul breakpoint;
    • Pause - dacă programul nu este oprit (într-un breakpoint), atunci accesta poate fi întrerupt facând click pe acest buton;
    • Continue - dacă programul este oprit (într-un breakpoint), atunci el poate fi rulat mai reparte până la următorul breakpoint cu ajutorul acestui buton;
    • Step Over - programul va executa linia curentă (inclusiv orice apel de funcție ar fi pe linia curentă) și trece la linia următoare unde se oprește;
    • Step Into - programul va executa linia curentă iar dacă pe linia curentă există un apel de funcție, se va opri pe prima linie din funcția respectivă;
    • Step Out - programul va termina de executat funcția curentă și se va opri pe prima linie după linia unde a fost apelată funcția respectivă;
    • Run to Cursor - programul va executa toate liniile și se va opri pe linia unde este plasat cursorul; dacă acesta nu este plasat în calea execuției programului, acesta se va rula până la final;
    • Step Into Last or Selected Function Called From Current Line - similar cu Step Into doar că dacă există mai multe apeluri de funcții pe linia curentă, această opțiune permite selectarea celei în care se va opri programul.
  1. Zona albastră - vizualizarea stării execuției programului; aveți la dispoziție trei taburi noi:
    • Variables - aici se pot vedea valorile curente ale tuturor variabilelor valide în scope-ul curent al programului; inclusiv aici se pot adăuga watches care permit vizualizarea valorilor calculate din expresii complexe scrise în limbajul C;
    • Call Stack - aici se poate vedea în orice moment stiva de execuție a programului;
    • Breakpoints - aici se poate vedea lista de breakpoints din programul curent.

Pentru a exersa utilizarea sistemului de debug, realizați următoarele operații:

  1. Parcurgeti tot programul folosind Step Over și vizualizând valoarea variabilei value la fiecare pas, până la ultima linie din program, unde utilizați Continue.
  2. Reporniți aplicația în modul de debug și puneți un al doilea breakpoint pe linia cu apelul funcției printf.
  3. Folosiți Continue pentru a ajunge la al doilea breakpoint.
  4. Odată ajunși acolo, folosiți Step In pentru a intra în funcția printf (neavând codul sursă, veți vedea codul de asamblare obținut din dezasamblarea fișierului obiect de către GDB).
  5. Folosiți Step Out pentru a reveni în funcția main și apoi Continue pentru a termina execuția.
  6. Reporniți aplicația în modul de debug și realizați un watch cu valoarea lui value + 1. Vizualizați pas cu pas execuția programului.

Tips & Tricks

Suport pentru instrumente de Revision Control

Netbeans oferă suport grafic pentru cele mai utilizate intrumente de revision control: SVN, Git, Mercurial, etc. Pentru a crea un repository nou de Git pentru proiectul curent din interfața grafică, puteți da click dreapta pe numele proiectului, apoi Versioning -> Initialize Git repository...:

Git Init

După operațiunea de init, meniul Versioning se va schimba în Git, de unde se pot realiza toate operațiile cunoscute din Git: add, remove, commit, push, pull, merge, rebase, diff, etc.

Formatare automată a codului

Netbeans oferă opțiunea de a formata automat codul prin selectarea Source -> Format.

Ce probleme rezolvă această formatare automată:

  • alinierea liniilor în funcție de blocurile de instrucțiuni și tipurile de statements de pe fiecare linie;
  • plasarea sau eliminarea de spații acolo unde este necasar.

Ce probleme NU rezolvă această formatare automată;

  • lipsa acoladelor de la blocurile if și for;
  • numele insuficient de sugestive pentru numele de funcții, structuri sau variabile.

Nu uitați de regulile următoare: Convenții de cod - C