Diferență între revizuiri ale paginii „SDA Lucrarea 1”
Linia 1: | Linia 1: | ||
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. | 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 | + | = Utilizarea IDE-ului CLion = |
− | [https:// | + | [https://www.jetbrains.com/clion CLion] este un mediu integrat de dezvoltare (IDE) care permite dezvoltarea de programe în limbajele C și C++. CLion nu instalează și compilator pentru C/C++, acesta trebuie instalat manual, în prealabil. |
<div class="regula"><span style="color: red; font-weight: bold">Atenție:</span> Imaginea de Linux folosită la Programarea Calculatoarelor are deja instalat compilatorul de C.</div> | <div class="regula"><span style="color: red; font-weight: bold">Atenție:</span> Imaginea de Linux folosită la Programarea Calculatoarelor are deja instalat compilatorul de C.</div> | ||
Linia 23: | Linia 23: | ||
<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> | <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 | + | == Instalarea CLion == |
− | De la adresa https:// | + | De la adresa https://www.jetbrains.com/clion/download/#section=linux puteți descărca kitul de instalare pentru sistemul vostru de operare. |
+ | După instalare, urmaţi următorii paşi de configurare, în funcţie de suita de programe aleasă: | ||
+ | * [https://www.jetbrains.com/help/clion/quick-tutorial-on-configuring-clion-on-windows.html#Cygwin Configurare CLion cu Cygwin] | ||
+ | * [https://www.jetbrains.com/help/clion/quick-tutorial-on-configuring-clion-on-windows.html#MinGW Configurare CLion cu MinGW] | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
== Realizarea unui proiect == | == Realizarea unui proiect == | ||
− | + | Odată pornit, CLion oferă posibilitatea de a deschide un proiect existent, sau de a crea unul nou. Vrem să realizăm un proiect nou, aşadar se va alege '''New Project'''. | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | <div class="regula"> ''' Observație: ''' Se poate realiza un nou proiect atunci când altul este deja deschis folosind meniul <code>File - New Project </code> .</div> | |
− | + | [[Fișier:Welcome_to_clion.png | 600px | Imaginea 1]] | |
− | + | <br> Mai departe se va selecta categoria '''C++ Executable''' şi se va introduce locaţia proiectului. | |
− | + | <div class="regula"><span style="color: red; font-weight: bold">Atenție:</span> În imagine se observă că locaţia introdusă este '''/home/student/projects/NewProject'''. Se recomandă ca directorul în care se realizează proiectul să aibă numele proiectului, sau un nume sugestiv (în imagine '''NewProject''')</div> | |
− | + | [[Fișier:New_project_location_clion.png | 600px | Imaginea 2]] | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | == | + | == Componentele IDE-ului CLion == |
− | + | [[Fișier:CLion_env.png | 1000px | Imaginea 3]] | |
− | |||
− | |||
− | + | La crearea unui nou proiect, IDE-ul CLion generează automat fişierul '''main.cpp'''. Acesta conţine un exemplu program ce va fi rescris de către utilizator. <br> | |
− | |||
− | |||
− | |||
− | < | ||
− | + | Secţiunile marcate în imagine reprezintă: | |
− | + | # Zona <span style="color: green">verde</span> - '''Project view''' indică toate fişierele şi directoarele ce alcătuiesc proiectul. | |
− | [[Fișier: | + | # Zona <span style="color: blue">albastră</span> - '''Editor''' este fereastra de vizualizare şi editare a textului |
− | + | # Zona <span style="color: red">roşie</span> - '''Toolbar''' oferă acces rapid pentru operaţiile uzuale. Dintre acestea, cel mai des vom folosi: | |
− | + | #*'''Build''' [[Fișier:CLion_build_button.png | 16px]] | |
+ | #*'''Run''' [[Fișier:CLion_run_button.png | 16px]] | ||
+ | #*'''Debug''' [[Fișier:CLion_debug_button.png | 16px]] | ||
+ | # Zona <span style="color: gold">galbenă</span> - '''Run''' este zona în care se introduc datele de intrare şi se în care vor fi afişate datele de ieşire. | ||
== Exemplu de program în modul ''debug'' == | == Exemplu de program în modul ''debug'' == | ||
Linia 130: | Linia 78: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | + | Pentru a executa programul în modul debug trebuie sa introducem cel puţin un '''breakpoint'''. Astfel indicăm programului unde se va opri pentru a ne acorda control asupra execuţiei, având posibilitatea de a continua execuţia pas cu pas. <br> | |
+ | |||
+ | Introducem un nou breakpoint dând click în dreptul liniei de la care vrem să obţinem controlul. În cazul nostru, vom alege să indroducem un breakpoint chiar la definirea variabilei <code>value</code>. | ||
+ | |||
+ | [[Fișier:CLion_breakpoint.png | 1000px | Imaginea 4]] | ||
+ | |||
+ | <div class="regula"><span style="color: red; font-weight: bold">Atenție:</span> Când alegem locaţia unui breakpoint trebuie să ţinem cont de următorul aspect: în modul '''debug''' programul se va opri '''înainte''' de a executa linia în dreptul căreia a fost introdus breakpoint-ul!</div> | ||
+ | |||
+ | În continuare, trebuie se pornim execuţia programului in modul debug [[Fișier:CLion_debug_button.png | 16px]]. Observăm apariţia ferestrei Debug (chenarul albastru, Imaginea 5) ce conţine următoarele: | ||
+ | #Zona <span style="color: gold">galbenă</span> - fereastra cu toate variabilele declarate, împreună cu valorile lor. Momentan nu există nicio variabilă declarată (deoarece linia asupra la care ne-am oprit nu a fost încă executată!) | ||
+ | #Zona <span style="color: red">roşie</span> - Permite trecerea între fereastra pentru procesul de depanare ('''Debugger''') şi fereastra în care se afişează/introduc datele ('''Console''') | ||
+ | #Zona <span style="color: green">verde</span> - Conţine comenzile pentru controlul execuţiei în modul debug (comenzi numite '''stepping actions'''): | ||
+ | #*'''Step over''' [[Fișier:CLion_step_over.png | 16px]] - Execută comenzile de pe linia curentă şi trece la următoarea linie | ||
+ | #*'''Step into''' [[Fișier:CLion_step_into.png | 16px]] - 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ă. Această comandă este utilă atunci cand pe linia curentă se află un apel de funcţie şi vrem sa studiem comportamentul codului din interiorul funcţiei. | ||
+ | #*'''Step out''' [[Fișier:CLion_step_out.png | 16px]] - Termină de executat funcţia în care se află linia curentă | ||
+ | #*'''Run to cursor''' [[Fișier:CLion_run_to_cursor.png | 16px]] - Execută toate instructiunile până se intâlneste cursorul. | ||
− | + | <div class="regula"> ''' Observație: ''' În modul debug, linia curentă este marcată de către mediul de dezvoltare prin colorarea acesteia cu albastru.</div> | |
− | + | Alte comenzi utile: | |
− | + | *'''Resume program''' [[Fișier:CLion_resume_project.png | 16px]] - Continuă execuţia pâmă la următorul breakpoint (dacă nu există, se va executa până la final) | |
− | + | *'''Stop''' [[Fișier:CLion_stop.png | 16px]] - Se opreşte definitv execuţia programului, împreună cu modul debug | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | [[Fișier:CLion_debug_process.png | 1000px | Imaginea 5]]<br> | |
− | |||
− | |||
− | |||
Pentru a exersa utilizarea sistemului de debug, realizați următoarele operații: | 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 ''' | + | # 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 '''Resume program'''. |
# Reporniți aplicația în modul de debug și puneți un al doilea ''breakpoint'' pe linia cu apelul funcției <code>printf</code>. | # 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 ''' | + | # Folosiți '''Resume program''' 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). | # 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 ''' | + | # Folosiți '''Step Out''' pentru a reveni în funcția <code>main</code> și apoi '''Resume program''' pentru a termina execuția. |
− | + | ||
== Tips & Tricks == | == Tips & Tricks == | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
=== Formatare automată a codului === | === Formatare automată a codului === | ||
− | + | CLion oferă opțiunea de a formata automat codul prin selectarea '''Code -> Reformat Code'''. | |
Ce probleme rezolvă această formatare automată: | Ce probleme rezolvă această formatare automată: | ||
Linia 180: | Linia 124: | ||
* numele insuficient de sugestive pentru numele de funcții, structuri sau variabile. | * numele insuficient de sugestive pentru numele de funcții, structuri sau variabile. | ||
− | Nu uitați de regulile următoare: [[Convenții de cod - C]] | + | Stilul conform căruia este modificat codul poate fi configurat folosind meniul <code>File|Settings|Editor|CodeStyle</code> |
+ | |||
+ | === Generare automată a codului === | ||
+ | |||
+ | CLion oferă posibilitatea de a genera fragmente de cod des înâlnite, precum constructori şi operatori în interiorul claselor. Această acţiune poate fi realizată folosind meniul <code> Code|Generate</code>. | ||
+ | |||
+ | === Altele === | ||
+ | * [https://www.jetbrains.com/help/clion/using-todo.html TODO Comments] | ||
+ | |||
+ | <br> Nu uitați de regulile următoare: [[Convenții de cod - C]] | ||
<!-- | <!-- |
Versiunea de la data 29 septembrie 2024 18:47
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 CLion
CLion este un mediu integrat de dezvoltare (IDE) care permite dezvoltarea de programe în limbajele C și C++. CLion nu instalează și compilator pentru C/C++, acesta trebuie instalat manual, în prealabil.
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:
gcc
), make
și git
.Instalarea CLion
De la adresa https://www.jetbrains.com/clion/download/#section=linux puteți descărca kitul de instalare pentru sistemul vostru de operare. După instalare, urmaţi următorii paşi de configurare, în funcţie de suita de programe aleasă:
Realizarea unui proiect
Odată pornit, CLion oferă posibilitatea de a deschide un proiect existent, sau de a crea unul nou. Vrem să realizăm un proiect nou, aşadar se va alege New Project.
File - New Project
.
Mai departe se va selecta categoria C++ Executable şi se va introduce locaţia proiectului.
Componentele IDE-ului CLion
La crearea unui nou proiect, IDE-ul CLion generează automat fişierul main.cpp. Acesta conţine un exemplu program ce va fi rescris de către utilizator.
Secţiunile marcate în imagine reprezintă:
- Zona verde - Project view indică toate fişierele şi directoarele ce alcătuiesc proiectul.
- Zona albastră - Editor este fereastra de vizualizare şi editare a textului
- Zona roşie - Toolbar oferă acces rapid pentru operaţiile uzuale. Dintre acestea, cel mai des vom folosi:
- Zona galbenă - Run este zona în care se introduc datele de intrare şi se în care vor fi afişate datele de ieşire.
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
3int 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}
Pentru a executa programul în modul debug trebuie sa introducem cel puţin un breakpoint. Astfel indicăm programului unde se va opri pentru a ne acorda control asupra execuţiei, având posibilitatea de a continua execuţia pas cu pas.
Introducem un nou breakpoint dând click în dreptul liniei de la care vrem să obţinem controlul. În cazul nostru, vom alege să indroducem un breakpoint chiar la definirea variabilei value
.
În continuare, trebuie se pornim execuţia programului in modul debug . Observăm apariţia ferestrei Debug (chenarul albastru, Imaginea 5) ce conţine următoarele:
- Zona galbenă - fereastra cu toate variabilele declarate, împreună cu valorile lor. Momentan nu există nicio variabilă declarată (deoarece linia asupra la care ne-am oprit nu a fost încă executată!)
- Zona roşie - Permite trecerea între fereastra pentru procesul de depanare (Debugger) şi fereastra în care se afişează/introduc datele (Console)
- Zona verde - Conţine comenzile pentru controlul execuţiei în modul debug (comenzi numite stepping actions):
- Step over - Execută comenzile de pe linia curentă şi trece la următoarea linie
- 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ă. Această comandă este utilă atunci cand pe linia curentă se află un apel de funcţie şi vrem sa studiem comportamentul codului din interiorul funcţiei.
- Step out - Termină de executat funcţia în care se află linia curentă
- Run to cursor - Execută toate instructiunile până se intâlneste cursorul.
Alte comenzi utile:
- Resume program - Continuă execuţia pâmă la următorul breakpoint (dacă nu există, se va executa până la final)
- Stop - Se opreşte definitv execuţia programului, împreună cu modul debug
Pentru a exersa utilizarea sistemului de debug, realizați următoarele operații:
- 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 Resume program. - Reporniți aplicația în modul de debug și puneți un al doilea breakpoint pe linia cu apelul funcției
printf
. - Folosiți Resume program pentru a ajunge la al doilea breakpoint.
- 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). - Folosiți Step Out pentru a reveni în funcția
main
și apoi Resume program pentru a termina execuția.
Tips & Tricks
Formatare automată a codului
CLion oferă opțiunea de a formata automat codul prin selectarea Code -> Reformat Code.
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.
Stilul conform căruia este modificat codul poate fi configurat folosind meniul File|Settings|Editor|CodeStyle
Generare automată a codului
CLion oferă posibilitatea de a genera fragmente de cod des înâlnite, precum constructori şi operatori în interiorul claselor. Această acţiune poate fi realizată folosind meniul Code|Generate
.
Altele
Nu uitați de regulile următoare: Convenții de cod - C
Probleme propuse
Problemele de mai jos au anumite erori care trebuie gasite si raparate folosind debugger-ul.
Problema 1
Programul de mai jos ar trebui să citească de la tastatură un șir de maxim 1024 caractere și să afișeze câte litere mici, câte litere mari și câte cifre conține acest șir. Totuși acest program are o eroare. Folosiți debugger-ul pentru a o identifica și repara.
Exemplu de intrare:
Ana a plecat la piata si a cumparat 10 saci de cartofi.
Ieșirea pentru intrarea de mai sus:
40 1 2
#include <stdio.h>
int main() {
char c;
unsigned uppercaseChars = 0;
unsigned lowecaseChars = 0;
unsigned digits = 0;
while(scanf("%c", c) != EOF) {
if(c > 'a' || c < 'z') {
lowecaseChars++;
} else if(c > 'A' && c < 'Z') {
uppercaseChars++;
} else {
digits++;
}
}
printf("%u %u %u", lowecaseChars, uppercaseChars, digits);
return 0;
}
Problema 2
Un tehnician a măsurat un număr mare n de rezistori şi a obţinut n valori de rezistenţe. Tehnicianul ştie că rezistorii sunt de acelaşi fel, dar pentru că sunt vechi şi codul culorilor nu mai este vizibil, doreşte să calculeze valoarea nominală a rezistenţei (R) şi dispersia valorilor, (S). Apoi, având aceste valori, el vrea să determine câte din rezistenţele testate (procentual) se încadrează în intervalul [R – S; R + S]. Rezistenţa nominală se calculează ca media aritmetică a valorilor rezistenţelor, iar formula dispersiei este dată mai jos.
Cerinţă Dându-se un număr n de rezistori şi valorile rezistenţelor acestora Ri (i = 1, ..., n), să se determine procentul rezistoarelor care au rezistenţa în intervalul [R– S; R + S].
Date de intrare Pe prima linie se află numărul întreg n. Pe următoarea linie, separate printr-un spaţiu, sunt n valori fracţionare de rezistenţe (în ohmi).
Date de ieşire Se va afişa o singură valoare fracţionară, cu exact două zecimale reprezentând procentul de rezistori cu rezistenţa în intervalul [R – S; R + S].
Restricţii şi precizări:
1 < n < 1000
1.0 <= Ri <= 10000.0
S=sqrt( pow(sum(R[i]−R),2) / n )
Exemplu:
Input = 10
76 1 20 37 19 92 61 96 37 77
Output = 50.00
#include <vector>
#include <string>
#include <unordered_map>
#include <algorithm>
#include <cstdio>
int main() {
int n;
double values[n];
scanf("%d", &n);
int sum = 0;
for(int i = 0; i < n; i++){
scanf("%lf", &values[i]);
sum += values[i];
}
double average = sum / n;
double dispersion = 0;
for(int i = 0; i < n; i++){
dispersion += (values[i] - average) * (values[i] - average);
}
dispersion = sqrt(dispersion / n);
int larger = 0;
for(int i = 0; i < n; i++) {
if(values[i] >= average - dispersion
&& values[i] <= average + dispersion) larger++;
}
printf("%.2lf", 100 * larger / n);
return 0;
}
Problema 3
Sunteți angajați de ministerul învățamântului să scrieți un program care să listeze toți elevii care au promovat examenul de bacalaureat. De la tastatură se introduce un număr n reprezentând numărul de candidați, apoi pe următoarele n linii, un nume de elev (format din exact două cuvinte: nume și prenume) și notele la cele patru materii, format fracționar, valori între 1 și 10. Să se afișeze toți studenții care au promovat examenul de bacalaureat (media mai mare ca 6, fiecare notă mai mare ca 5) în ordinea inversă a introducerii lor, împreună cu media de promovare, afișată cu fix două zecimale.
Exemplu de date de intrare:
4
Gheorghe Ghita 8 7 5.5 10
Vuia Vasile 4 10 10 10
Andreescu Andra 9 10 9 10
Elenescu Elena 5 5 5 5
Ieșirea pentru intrarea de mai sus:
Andreescu Andra 9.50
Gheorghe Ghita 7.63
#include <stdio.h>
struct studenti{
char n[128];
char m[128];
float a,b,c,d;
};
int main(){
int n,i;
struct studenti s[n];
scanf("%d", &n);
for(i=0;i<n;i++)
scanf("%s%s%f%f%f%f",&s[i].n,&s[i].m,&s[i].a,&s[i].b,&s[i].c,&s[i].d);
for(i=n;i>0;i--){
float m=(s[i].a+s[i].b+s[i].c+s[i].d)/4;
if(s[i].a>5&&s[i].b>5&&s[i].c>5&&s[i].d>5||m>=6){
printf("%s %s %.2f\n",s[i].n,s[i].m,m);
}
}
return 0;
}