Documente Academic
Documente Profesional
Documente Cultură
Suport de curs
prof.univ.dr.Mariana Marinescu
Cuvinte importante:
- elemente de baza ale limbajului C/C++: identificatori, separatori,
comentarii;
- structura unui program C/C++: functia main (), definirea si aplul
unei functii;
- preprocesare: directiva #include si fisierul antet (header),
directiva #define;
- utilizarea functiilor din bibliotecile standard: prototipul unei
functii; apelul functiei dintr-o biblioteca standard;
- etapele dezvoltarii unui program C/C++: compilare, link-editare,
executie;
- variabile: tipuri de variabile predefinite, declararea variabilelor,
variabile locale si globale;
- citirea datelor de la tastatura si afisarea datelor pe ecran in
limbajul C/C++: functia scanf () si functia printf (); fluxul I/O cin si fluxul
I/O cout;
Notiuni introductive
Istoric C/C++:
- 1972 - Brian Kernighan si Dennis Ritchie au conceput un limbaj cu
destinatie universala, denumit C;
- 1980 - Bjarne Stroustrup publica specificatiile limbajului C++, o
extensie a limbajului C destinata programarii orientate pe obiecte.
Setul de caractere folosit:
Setul de caractere utilizat pentru scrierea programelor C/C++ este setul de
caractere al codului ASCII.
Limbajul C/C++ este case-sensitive, adica face diferenta intre literele mici si
literele mari. De aceea, identificatorii sunt diferiti in functie daca sunt scrisi cu litere
mici si mari.
Cuvintele-cheie (keywords) sunt identificatori speciali, cu inteles predefinit, care pot
fi utilizati numai in constructii sintactice in care sunt specificati. De exemplu: if,
while etc. In limbajul C/C++, toate cuvintele-cheie se scriu numai cu litere mici.
Separatori
Separatorii au rolul de a separa unitatile sintactice:
- Ca separatori generali se utilizeaza caracterele albe: spatiu ( ), TAB
(\t), sfarsit de linie (\n) si comentariile.
- Separatorii specifici sun folositi, de exemplu, pentru a separa unele
constructii sintactice: variabilele sunt separate prin caracterul virgula (,).
- Delimitatorii sunt folositi, de exemplu, pentru:
- a delimita sfarsitul unei instructiuni sau al unei declaratii caracterul punct si virgula (;);
- a delimita o constanta de tip caracter - caracterul apostrof ();
- a delimita constantele sir de caractere(ghilimelele ).
4
Comentarii
Comentariile sunt texte care vor fi ignorate de compilator, dar au rolul de a explicita
si de a face mai lizibil pentru programator anumite secvente de program.
Din punct de vedere sintactic, un comentariu este:
- o succesiune de caractere incadrata intre /* si */ ; aceste comentarii pot fi
formate din mai multe linii;
- o succesiune de caractere care incepe cu // si se termina la sfarsitul unei
singure linii.
Programul de mai sus nu executa nimic, el fiind constituit numai din functia main ().
In general, o functie este o colectie de instructiuni care executa o anumita sarcina.
O functie se defineste prin:
- antetul functiei;
- corpul functiei.
Antetul functiei contine numele functiei, tipul rezultatului pe care il calculeaza si il
returneaza functia si o lista de parametri, fiecare avand un tip precizat, prin care
functia comunica cu exteriorul ei, incadrata intre paranteze rotunde:
Corpul functiei este constituit din declaratii si instructiuni cara executa diferite
sarcini. Toate declaratiile si instructiunile din corpul functiei sunt incadrate intre
paranteze acolade.
Sintaxa definirii unei functii este:
<tip_rezultat> nume_functie (<lista_parametri>)
{ <corpul_functiei> }
Nota: In cazul functiei main () prezentata mai sus, cuvantul-cheie void, care apare
intre paranteze, spune compilatorului de C ca functia nu utilizeaza nici un parametru.
Cuvantul-cheie void, care apare inaintea functiei main () specifica faptul ca functia
nu intoarce nici un rezultat (este de tip void).
In mod obisnuit functiile folosesc instructiunea return pentru incheierea executiei
lor si pentru a returna rezultatul calculelor catre functia care le-a apelat.
Sintaxa instructiunii return este:
return <expresie>;
unde:
- <expresie> - specifica valoarea returnata de functie si este, de fapt valoarea
functiei.
In cazul functiei main (), daca este specificat cuvantul-cheie void inaintea functiei,
atunci nu se foloseste instructiunea return pentru returnarea rezultatului functiei.
Daca functia main () este precedata de un alt tip de data (de exemplu int) atunci este
necesara folosirea instructiunii return. In acest caz, rezultatul returnat de functia
main () este preluat de sistemul de operare si ofera indicatii despre modul de
functionare a programului. Cand executia unui program se termina cu succes, in mod
uzual programul returneaza valoarea 0.
7
De exemplu:
int main (void)
{ return 0; }
Acest program nu face nimic, dar se termina cu succes.
In caz ca apar erori pe parcursul executiei programului, functia main () returneaza o
valoare diferita de 0, care, de obicei, codul specific erorii care a aparut pe parcursul
executiei programului.
Preprocesare
Preprocesorul este un program lansat in executie automat inainte de compilare. El
executa toate directivele preprocesor incluse in program, efectuand substitutii de
texte. Toate directivele incluse in program incep cu caracterul # si sunt puse
inaintea oricaror declaratii de variabile sau functii (deci, sunt plasate la inceputul
programului).
De exemplu, #include, #define, #if, #undef etc.
Pentru elaborarea programelor trebuie sa intelegem doua dintre aceste directive, si
anume, #include si #define.
8
Directiva #include este utilizata pentru a include intr-un program un fisier antet
(header) standard sau creat de programator.
Un fisier antet (header) contine declaratiile functiilor, constantelor, variabilelor si
tipurilor definite intr-o biblioteca standard sau creata de programator. Fisierul antet
este specific bibliotecii folosite si are intotdeauna extensia .h .
Pentru a include intr-un program un fisier antet (existent in biblioteca standard a
limbajului) se foloseste sintaxa:
#include <<nume_fisier_antet>.h>.
De exemplu:
#include <math.h> - include fisierul antet al bibliotecii de functii matematice;
#include <iostream.h> - include un fisier antet al bibliotecii limbajului C++ cu
functii de intrare/iesire;
#include <stdio.h> - include un fisier antet al bibliotecii limbajului C cu functii de
intrare/iesire.
Directiva #define permite definirea unei constante simbolice. Sintaxa folosita este:
#define <identificator_constanta> valoare
Ca efect, preprocesorul va substitui in program orice aparitie a identificatorului de
constanta cu valoarea acesteia.
De exemplu:
#define PI 3.1415
#define NrMaxPersoane 35
Nota: Se recomanda utilizarea constantelor simbolice atunci cand se doreste sa se
asocieze o denumire mai sugestiva la o valoare. De asemenea, prin utilizarea
constantelor simbolice programul devine mai usor de modificat.
Observatie: Fisierele antet contin si definitii de constante simbolice. De exemplu:
- in fisierul antet values.h sunt definite constante simbolice cum ar fi:
MAXINT (cu valoarea 32767) si MAXLONG (cu valoarea 2147483647) etc;
- in fisierul antet conio.h sunt definite constantele simbolice pentru culori
(de exemplu: BLACK cu valoarea 0, BLUE cu valoarea 1, GREEN cu valoarea 2,
RED cu valoarea 4 etc).
10
12
13
14
Scrierea
instructiunilor
programului-sursa
(.c sau .cpp)
Compilarea
programuluisursa
Cu succes?
Editarea
legaturilor
pentru
programul
obiect (.obj)
Cu succes?
Executia
programului
(.exe)
Modificarea
instructiunilor
programului
15
Variabile
Variabila este o zona temporara de stocare, rezidenta in memoria RAM, care are un
nume simbolic (identificator) si stocheaza un anumit tip de date. Ea poate fi
modificata pe parcursul executiei programului.
Pentru utilizarea unei variabile intr-un program C/C++ trebuie ca aceasta sa fie
declarata. La declararea variabilei trebuie specificat numele simbolic al variabilei,
tipul acesteia si, eventual, o valoare initiala care se atribuie variabilei.
Tipurile de date predefinite
Un tip de date defineste multimea de valori pe care variabila poate sa le stocheze,
modul de reprezentare a acestora in memorie, ca si setul de operatii pe care
programul poate sa le realizeze cu aceste date.
Limbajul C/C++ accepta urmatoarele tipuri de baza: int, char, float, double, void.
Observatie:
In functie de compilatorul utilizat si de sistemul hardware folosit domeniul
valorilor si reprezentarea interna in memorie pentru tipurile de date, enumerate mai
sus, pot fi diferite.
16
Valori
Reprezentare in
memorie
int
[-32768, 32767]
2 bytes, cu semn
unsigned int
[0, 65535]
long int
[0, 4294967295]
Nota: Atunci cand un tip de date nu este precizat, implicit este considerat int.
Astfel, se poate specifica numai modificatorul long sau unsigned sau unsigned
long, tipul fiind implicit int.
Constantele intregi sunt numere intregi din intervalul corespunzator tipului.
Ele pot fi specificate in:
- baza 10 - folosind notatia uzuala;
- baza 8 - constanta este precedata de un 0 (zero) nesemnificativ;
- baza 16 - constanta este precedata de 0x sau 0X.
De exemplu:
25 - constatnta zecimala de tip int;
28231567 - constanta de tip long int;
01230 - constanta octala;
0x1a3 - constanta hexazecimala.
Tipul constanei este determinat implicit de valoarea ei.
18
Tip
Valori
Reprezentare in
memorie
char
[-127,128]
1 octet, cu semn
unsigned char
[0, 255]
19
Se poate atribui o valoare unei variabile de tip char intr-una din modalitatile
urmatoare:
- atribuirea codului ASCII corespunzator caracterului; de exemplu litera
A are codul ASCII 65:
char litera = 65;
- folosirea unei constante de tip caracter care apare intre doua apostrofuri:
char litera = A;
Nota: Variabilele de tip char nu pot pastra decat un caracter la un moment dat.
Pentru a pastra un sir de caractere trebuie declarata o variabila indexata de tip char.
Constantele de tip char (unsigned char) pot fi numere intregi din intervalul
specificat sau caracterele care au codurile ASCII in intervalul specificat. Rezulta ca
datele de tip char par a avea o natura duala - caractere ASCII si numere intregi.
Dar compilatorul interpreteaza valorile de tip char ca fiind caractere ASCII in
functie de valorile numerice asociate (adica codurile ASCII asociate).De exemplu,
caracterul A si constanta 65 au pentru calculator aceeasi semnificatie.
20
Caracter special
\a
\b
\r
\n
\t
\\
Caracterul backslash
Caracterul apostrof
Caracterul ghilimele
\?
\nnn
\xnnn
22
Valori
Reprezentare in memorie
double
[1.7*10-308, 1.7*10+308]
[-1.7*10+308, -1.7*10-308]
long double
[3.4*10-4932, 1.1*10+4932]
[-3.4*10+4932, +1.1*10-4932]
23
Observatie: In limbajul C/C++ nu exista un tip de date special pentru valori logice
(true si false). Valoarea 0 este asociata valorii false, orice valoare diferita de 0 este
asociata valorii true.
Sintaxa folosita pentru declararea de variabile este:
<tip> <nume_v1> [= <expresie>] [, <nume_v2> [= <expresie2>] ];
unde:
- <tip> - specifica tipul de data al variabilelor;
- <nume_v1>, <nume_v2>, - specifica numele simbolic al variabilelor care se
declara (adica, identificatorii);
- <expresie1>, <expresie2>, - specifica o expresie de initializare; expresia trebuie
sa fie evaluabila in momentul declararii; sunt optionale si sunt folosite pentru a
atribui unor variabile anumite valori initiale.
Nota: Se pot declara simultan mai multe variabile de acelasi tip, separand numele
lor prin virgula.
25
26
De exemplu:
#include <stdio.h>
void main ()
{
int varsta;
int greutate;
int inaltime;
printf ("Totul despre C/C++");
#include <stdio.h>
void main ()
{
int varsta, greutate, inaltime;
printf ("Totul despre C/C++");
.
}
#include <stdio.h>
int main ()
{
int varsta = 41, greutate = 75, inaltime = 180;
printf (" varsta=%d\n greutate=%d\n inaltime=%d\n", varsta, greutate, inaltime);
return 0;}
Alte exemple de declaratii de variabile ce pot fi folosite intr-un program:
int a, b=3, c=8;
char h;
float x=b*5.6, y;
27
unde:
- <format> - este un sir de caractere care poate contine specificatori de format, caractere
albe (spatiu, tab sau newline) si alte caractere; caracterele albe prezente la intrare vor fi
ignorate; celelalte caractere (care nu fac parte dintr-un specificator de format) trebuie sa
fie prezente la intrare in pozitiile corespunzatoare;
- <adresa_v1>, <adresa_v2>, , <adresa_vn>) - adresele de memorie (pointeri) care
specifica variabilele in care se vor memora valorile citite de la tastatura; adresa unei
variabile se obtine cu ajutorul operatorului de referentiere & (de exemplu: &v1 este adresa
de memorie a variabilei v1).
28
29
Semnificatie
f, e sau g
31
De exemplu:
1. Fie declaratiile de variabile:
int a; unsigned long b; double c;
iar de la tastatura se introduc valorile: 650 -4.8 123000. Apeland functia:
scanf (%d %lf %lu, &a, &c, &b);
variabilei a i se atribuie valoarea 650, variabilei c i se atribuie valoarea -4,8 si
variabilei b i se atribuie valoarea 123000.
2. Fie declaratia de variabile:
char a1, a2, a3;
iar de la tastatura se introduc caracterele: 245. Apeland functia:
scanf (%c %c %c, &a1, &a2, &a3);
variabilei a1 i se atribuie caracterul 2, variabilei a2 i se atribuie caracterul 4 si
variabilei a3 i se atribuie caracterul 5.
32
Pentru citirea caracterelor au fost elaborate unele functii speciale cum ar fia
functiile: getch () si getche ().
Functia getch () este declarata in fisierul antet conio.h. Prototipul functiei este:
int getch (void);
La apelul functiei se citeste de la tastatura un caracter. Functia returneaza codul
ASCII al caracterului citit. Caracterul tastat nu este afisat pe ecran.
Functia getche () este declarata in fisierul antet conio.h. Prototipul functiei este:
int getche (void);
La apelul functiei se citeste de la tastatura un caracter. Functia returneaza codul
ASCII al caracterului citit. Caracterul tastat este afisat pe ecran.
34
Semnificatie
x, X
(continuare)
<litera_tip>
Semnificatie
e, E
38
De exemplu:
1. Citirea si afisarea datei calendaristice in formatul zz-ll-aa se poate face cu
urmatoarea secventa de program (numit citeste_data_ca.c):
#include <stdio.h>
void main ()
{
int zi, luna, an;
printf ("Introduceti o data calendaristica in formatul zz-ll-aa\n");
scanf ("%d-%d-%d", &zi, &luna, &an);
printf ("Data introdusa de dvs.\n%d-%d-%d", zi, luna, an);
}
2. Citirea unui caracter de la tastatura care nu este afisat atunci cand este tastat si
afisarea la ecran a caracterului introdus se poate face cu urmatoarea secventa de
program (numit citeste_codASCII.c):
#include <stdio.h>
#include <conio.h>
void main ()
{
int caracter;
printf ("Introduceti un caracter:");
caracter=getch ();
printf ("\nCaracterul introdus de dvs. este: %c", caracter);
}
39
3. Citirea unui caracter de la tastatura care este afisat atunci cand este tastat si afisarea la
ecran a caracterului introdus se poate face cu urmatoarea secventa de program (numit
citeste_codASCII.c):
#include <stdio.h>
#include <conio.h>
void main ()
{
int caracter;
printf ("Introduceti un caracter:");
caracter=getche ();
printf ("\n\nAti tastat caracterul: %c care are codul ASCII %d", caracter, caracter);
}
4. Fie declaratia de variabila:
float x=-243.192;
la apelul functiei:
printf (x=%f sau\n x=%e sau\n x=%g\n, x, x, x);
se afiseaza urmatoarele:
x=-243.192 sau
x=-2.43192e+02 sau
x=-243.192
40
unde:
De exemplu, programele prezentate la fluxul de intrare cin (in care s-a folosit
functia printf () pentru afisarea datelor) pot fi modificate pentru a folosi fluxul de
iesire cout (programele scriere_cout.cpp si scriere_cout1.cpp) astfel:
Varianta 1:
# include <iostream.h>
void main()
{int x, y, z;
cout<< "introduceti numerele:" << '\n';
cin >> x;
cin >> y;
cin >> z;
cout << "Numerele introduse de dvs. sunt: ";
cout << x;
cout << ;
cout << y;
cout << ;
cout << z;
}
46
Variana 2:
# include <iostream.h
void main()
{int x, y, z;
cout << "introduceti numerele: " << endl;
cin >> x >> y >> z;
cout << "Numerele introduse de dvs. sunt: " << x << << y << << z << '\n';
}
47
Nota: Se pot utiliza modificatorii dec, oct, hex pentru a afisa valorile in zecimal,
octal si hexazecimal. Iata un exemplu de program (cu numele scriere_cout2.cpp)
care face conversii ale unor numere in octal si hexazecimal:
# include <iostream.h>
void main()
{int x, y, z;
cout << "introduceti numerele: " << endl;
cin >> x >> y >> z;
cout << "Numerele introduse de dvs. in baza 10 sunt: " << x << ' ' << y
<< ' ' << z << '\n';
cout << "Numerele introduse de dvs. in baza 8 sunt: " << oct << x << ' '
<< oct << y << ' ' << oct << z << '\n';
cout << "Numerele introduse de dvs. in baza 16 sunt: " << hex << x << ' '
<< hex << y << ' ' << hex << z << '\n';
}
48