LABORATORUL 01

Noțiuni introductive pentru limbajele C/C++

Durată: 2 ore Limbaj: C / C++ Mediu: Code::Blocks / Visual Studio / GCC PDF îndrumar EN English version

Prima ședință clarifică ce se întâmplă între momentul în care scriem un text într-un editor și momentul în care calculatorul execută un program. Înțelegerea celor patru etape - scriere, compilare, link-editare, execuție - explică majoritatea erorilor pe care le veți întâlni în restul semestrului.

1Obiectivele lucrării

  • Instalarea și configurarea unui mediu de dezvoltare pentru C/C++
  • Parcurgerea celor patru etape până la obținerea fișierului executabil
  • Distingerea erorilor de compilare de erorile de link-editare
  • Recunoașterea unităților sintactice: identificatori, cuvinte cheie, operatori, constante
  • Scrierea, compilarea și rularea primului program

2Mediul de lucru

  • IDE Code::Blocks sau Visual Studio
  • C Compilator GCC / MinGW
  • C++ Compilator G++
  • alt. Editor text + linie de comandă
Compilare din linia de comandă Dacă vreți să vedeți etapele explicit, folosiți terminalul: gcc program.c -o program.exe apoi ./program.exe

3Etapele obținerii unui executabil

Program sursă .c / .cpp Compilator + preprocesor Cod obiect .obj / .o Link-editor + biblioteci Executabil .exe O eroare la compilare oprește procesul înainte de codul obiect; o eroare de link apare abia la pasul următor.
Fig. 1 - Principalele etape parcurse pentru obținerea unui program executabil
EtapăCe faceRezultatErori tipice
Scriereredactarea codului într-un editor sau IDEfișier .cpp-
Preprocesareexpandează #include și #definecod sursă extinsfișier antet negăsit
Compilaretraduce sursa în cod mașinăfișier .objsintaxă greșită, tip incompatibil, variabilă nedeclarată
Link-editareleagă modulele obiect și bibliotecilefișier .exefuncție declarată dar nedefinită, main lipsă
Execuțieîncarcă programul în memorie și îl rulează-împărțire la zero, acces nevalid la memorie
Cum recunoașteți etapa în care ați greșit Un mesaj care indică un număr de linie din fișierul vostru este o eroare de compilare. Un mesaj de tipul undefined reference to ..., fără număr de linie, este o eroare de link-editare: funcția a fost declarată, dar corpul ei nu a fost găsit nicăieri.

4Elementele de bază ale limbajului

La scrierea unui program se folosesc unități sintactice care se încadrează în câteva categorii:

CategorieDescriereExemple
Identificatorinume date tipurilor, variabilelor, funcțiilorraza, _maxx, a5, A_B_C
Cuvinte cheieidentificatori rezervați, cu semnificație predefinităint, while, return, class
Semne de punctuațiedelimitează zone din cod[ ] ( ) { } , : ; #
Spații albeseparatori, cresc lizibilitateaspace (32), tab (9), newline (10)
Operatoriprecizează operațiile efectuate+ - * / % = == &&
Constantevalori fixe, numerice sau șiruri23, 3.14, 'A', "text"

Reguli pentru identificatori

IdentificatorValid?Motiv
Razadaîncepe cu literă
razadadiferit de Raza - limbajul este case sensitive
_maxxdapoate începe cu underscore
a5dacifra nu este pe prima poziție
5anuprimul caracter este cifră
A%Bnu% nu este caracter permis
Case sensitiveC/C++ face diferență între majuscule și minuscule. Total, total și TOTAL sunt trei variabile complet distincte. Este o sursă frecventă de erori „variabilă nedeclarată" la începători.

5Structura programului

Structura generală a unui program este alcătuită din trei zone:

ZonăConținutObligatorie?
I - directive de preprocesare#include, #defineopțională
II - declarații globaletipuri, prototipuri de funcții, variabile globaleopțională
III - definiții de funcțiicorpul funcțiilor, obligatoriu inclusiv main()obligatorie
Funcția main()Execuția programului începe întotdeauna cu main(). Ea este unică și nu poate fi supradefinită. Spre deosebire de Pascal, în C/C++ funcțiile nu pot fi definite una în interiorul alteia.

6Primul program

primul.c - varianta C
#include <stdio.h>        // zona I: directive de preprocesare

#define PI 3.14159         // constantă simbolică

int nr_rulari = 0;         // zona II: variabilă globală

int main(void)             // zona III: definiția funcției principale
{
    float raza, aria;      // declarații locale

    printf("Introduceti raza: ");
    scanf("%f", &raza);

    aria = PI * raza * raza;

    printf("Aria cercului = %.2f\n", aria);

    return 0;              // 0 = program terminat cu succes
}
primul.cpp - varianta C++
#include <iostream>
using namespace std;

const double PI = 3.14159;   // în C++ se preferă const în locul lui #define

int main()
{
    double raza, aria;

    cout << "Introduceti raza: ";
    cin >> raza;

    aria = PI * raza * raza;

    cout << "Aria cercului = " << aria << endl;

    return 0;
}
Diferența esențialăÎn C, intrarea/ieșirea se face cu funcții (printf, scanf) care primesc un format explicit. În C++ se folosesc fluxuri (cout, cin), iar tipul este dedus automat de compilator - mai sigur și mai comod.

7Atelier de cod

Aici puteți scrie și rula cod C direct în pagină. Programul se execută în browser, fără compilator instalat: apăsați Rulează și priviți ieșirea de mai jos. Butonul Pas cu pas execută programul instrucțiune cu instrucțiune și arată, în dreapta, ce valoare are fiecare variabilă în acel moment.

Structura unui program C - rulați, apoi modificați
#include <stdio.h>

int main(void)
{
    printf("Salut, lume!\n");
    printf("Ma numesc %s si am %d ani.\n", "Ana", 19);
    return 0;
}
De încercatÎncercați: ștergeți \n din primul printf și rulați din nou. Observați că cele două texte ajung pe aceeași linie - \n este singurul lucru care trece cursorul pe rândul următor.
Exercițiu - afișați o carte de vizită
#include <stdio.h>

int main(void)
{
    /* Completati programul astfel incat sa afiseze exact
       ceea ce se vede in coloana "iesirea asteptata".
       Aveti nevoie de patru apeluri printf. */

    printf("+----------------------+\n");

    return 0;
}

8Sarcini de lucru

  • Instalați mediul de dezvoltare și creați un proiect nou de tip aplicație consolă.
  • Scrieți, compilați și rulați programul care calculează aria cercului.
  • Ștergeți intenționat un caracter ; și citiți mesajul de eroare - notați linia indicată.
  • Apelați o funcție inexistentă (de exemplu calculeaza();) și observați că eroarea apare la link-editare, nu la compilare.
  • Verificați că limbajul este case sensitive: declarați int suma; și folosiți Suma.
  • Testați care dintre identificatorii din tabelul de mai sus sunt acceptați de compilator.
  • Scrieți același program în ambele variante, C și C++, și comparați dimensiunea executabilului rezultat.

9Aplicație de aprofundare

ExtindereScrieți un program care citește raza și afișează, într-un tabel aliniat, aria și circumferința cercului, aria sferei și volumul sferei. Folosiți #define pentru PI și formatarea %8.3f pentru aliniere. Comparați rezultatele cu cele obținute folosind M_PI din <math.h> și explicați eventualele diferențe.

10Întrebări de verificare

11Resurse