7/31/2019 Limbaj de programare C9
1/24
1
Cursul IX
Limbaje deprogramare
Limbaje deprogramare Conf.dr.L. STOLERIU [email protected]
7/31/2019 Limbaj de programare C9
2/24
iruriunidimensionale
Presupunemc vrems lucrmcutreintregi:
int a1, a2, a3;
Dac avemmaimultenumere? Soluiaconst nutilizareaunui ir(delungimetrei)de numere ntregi.
int a[3];
Elementeleacestui irvorfi: a[0] a[1] a[2]
Odeclaraiede irunidimensionalesteuntip urmatde
unidentificatorurmatdeparantezepatratecu o
expresientreag constant.
Valoareaconstantei(pozitiv),senumetelungimea
irului ieaspecific numruldeelementeale irului.2 Limbaje deprogramare Conf.dr.L. STOLERIU [email protected]
7/31/2019 Limbaj de programare C9
3/24
iruriunidimensionale
Pentru memorarea elementelor intrun sir, compilatorul
rezerva un spatiu de memorie corespunzator, pornind de
la o adresa de baza. Dimensiunea spatiului de memorie este egala cu numarul
de elemente ale sirului inmultit cu numarul de octeti
necesari memorarii unui element al sirului.
#define N 5
int a[N];
Alocaspatiupentrua[0],a[1],a[2],a[3]sia[4] adica 5intregix4
octetiperintreg
=20octeti
.
3 Limbaje deprogramare Conf.dr.L. STOLERIU [email protected]
7/31/2019 Limbaj de programare C9
4/24
iruriunidimensionale
Sirurilepotapartineclaselordememorare"auto","extern","static"sau"constant",darnupotfi"register".
Initalizare:float x[7] = {-1.1, 0.2, 33.0, 4.4, 5.05, 0.0,
7.7};
Inseamna:
x[0] = -1.1; x[1] = 0.2; . . .; x[6] = 7.7;
Dacaunsirdeclarat"extern"sau"static"nuesteinitializat,atuncisistemulinitializeazatoateelementele
cu0.Vectoriideclaraticonstantisauautomatic(ceiimpliciti)suntinitializaticuvaloriexistenteinmomentulexecutieiinmemorie.
4 Limbaje deprogramare Conf.dr.L. STOLERIU [email protected]
7/31/2019 Limbaj de programare C9
5/24
iruriunidimensionale
Dacaunsirestedeclaratfaraprecizarealungimiisi
initializatcuoseriedevalori,atuncilungimeasase
consideraimplicitnumaruldevaloriinitiale. Declaratiile
int a[] = {3, 4, 5, 6}; i
int a[4] = {3, 4, 5, 6};
suntechivalente.
Pentruaccesareaunuielementdinsir,vomscrie"a[i]",
saumaigeneral"a[expresie]",unde"expresie"esteo
expresieintegrala."i"senumesteindexalsiruluisipoate
aveavaloriintre0si"lungime1".
5 Limbaje deprogramare Conf.dr.L. STOLERIU [email protected]
7/31/2019 Limbaj de programare C9
6/24
iruriunidimensionale
#include
#include
void main()
{
int c, i, litera[26];
for (i = 0; i < 26; ++i) /* initializarea vectorului cu 0 */
litera[i] = 0;
while ((c = getchar()) != EOF) /* numararea literelor mari*/
if (isupper(c))
++litera[c - 'A'];
for (i = 0; i < 26; ++i) /* tiparirea rezultatelor */
{if (i % 6 == 0)
printf("\n");
printf("%5c:%4d", 'A' + i, litera[i]);
} }
6 Limbaje deprogramare Conf.dr.L. STOLERIU [email protected]
7/31/2019 Limbaj de programare C9
7/24
Relatiadintrevectorisipointeri
Numele unui sir (de exemplu "a") este o adresa, deci
poate fi privit ca valoare a unui pointer.
Sirurile si pointerii pot fi priviti oarecum la fel in ceea cepriveste modul cum sunt folositi pentru accesarea
memoriei.
Cu toate acestea, sunt cateva diferente. Cum numele unuisir este o adresa fixa (particulara), atunci aceasta o putem
gandi ca un pointer constant. Cand este declarat un sir,
compilatorul trebuie sa aloce o adresa de baza si unspatiu suficient de memorie care trebuie sa contina toate
elementele sirului.
7 Limbaje deprogramare Conf.dr.L. STOLERIU [email protected]
7/31/2019 Limbaj de programare C9
8/24
Relatiadintrevectorisipointeri
Adresa de baza a unui sir este locatia initiala din memorie
unde sirul este memorat; aceasta coincide cu adresa
primului element (de index 0) al sirului.#define N 100
int a[N], *p;
Atuncisistemulvarezervaoctetii(sazicem)numerotati300,304,...,696cafiindadreseleelementelor a[0],a[1],
...,a[99]
p = a; si p = &a[0];suntechivalentesivorasignalui"p"valoarea300(ca
adresadememorie).
8 Limbaje deprogramare Conf.dr.L. STOLERIU [email protected]
7/31/2019 Limbaj de programare C9
9/24
Relatiadintrevectorisipointeri
Aritmeticapointerilorpuneladispozitieoalternativapentruindexareasirurilor.
Instructiunile p = a + 1; si p = &a[1];
suntechivalentesivaasignalui"p"valoarea302(adresa,bineinteles).
suma = 0;
for (p = a; p < &a[N]; ++p)
suma += *p;
(adunaelementelesiruluia[])
9 Limbaje deprogramare Conf.dr.L. STOLERIU [email protected]
7/31/2019 Limbaj de programare C9
10/24
Pointeriaritmetici
Pointeriiaritmeticireprezintaunadintrasaturile
puternicealelimbajuluiC.Dacavariabila"p"estepointer
catreuntipparticular,atunciexpresia"p+1"reprezintaadresamasinapentrumemorareaurmatoareivariabilede
acesttip.
Inmodsimilar,p + i, ++p, p += i ausens.
Daca"p"si"q"suntpointericatreelementedetipvector,
atunci"p q"intoarcevaloarea"int"sireprezinta
numaruldeelementedintre"p"si"q".
10 Limbaje deprogramare Conf.dr.L. STOLERIU [email protected]
7/31/2019 Limbaj de programare C9
11/24
Pointeriaritmetici
void main()
{
double a[2], *p, *q;
p = &a[0]; /* pointeaza catre baza sirului */
q = p + 1; /* echivalent cu q = &a[1]; */
printf("%d\n", q - p); /* se va tipari 1 */
printf("%d\n", (int)q - (int)p); /*va tipari 8*/
}
11 Limbaje deprogramare Conf.dr.L. STOLERIU [email protected]
7/31/2019 Limbaj de programare C9
12/24
iruricaargumentepentrufunctii
Introdefinitiedefunctie,unparametruformalcareeste
declaratcaunsirestedefaptunpointer.Candestetrimis
unsir,atuncisetrimitedefaptadresadebaza.Elementelevectoruluinusuntcopiate.Caoconventiede
notatie,compilatorulpermitefolosireaparantezelor
patrate([,])indeclarareasirurilorcaparametri.
int suma(int a[], int n) /* n dimensiunea sirului */
{
int i, s = 0;
for (i = 0; i < n; ++i)
s += a[i];
return s;
}
12 Limbaje deprogramare Conf.dr.L. STOLERIU [email protected]
7/31/2019 Limbaj de programare C9
13/24
iruricaargumentepentrufunctii
Inantetul functiei precedente,declaratia:
int a[]; este echivalenta cu int *a;
Pe dealta parte,declaratiile demai sus nusuntechivalente daca seutilizeaza inalta parte:
primasereferalacreeareaunuipointerconstant(faraspatiudememorie);
adouavacreaovariabilapointer.
Presupunemca"v"estedeclaratcafiindunsirde100de
elementedetip"int".Dupaceamatribuitvalorielementelorsale,putemutilizafunctia"suma()"pentruaadunaanumitevalorialelui"v".
13 Limbaje deprogramare Conf.dr.L. STOLERIU [email protected]
7/31/2019 Limbaj de programare C9
14/24
iruricaargumentepentrufunctii
int suma(int a[], int n) /* n dimensiunea sirului */
{
int i, s = 0;
for (i = 0; i < n; ++i)
s += a[i];
return s;
}
14
Apel Ce se calculeaza
suma(v, 100) v[0] + v[1] + ... + v[99]
suma(v, 88) v[0] + v[1] + ... + v[87]
suma(&v[7], k-7) v[7] + v[8] + ... + v[k - 1]
suma(v + 7, 2 * k) v[7] + v[8] + ... + v[2 * k + 6]
Limbaje deprogramare Conf.dr.L. STOLERIU [email protected]
7/31/2019 Limbaj de programare C9
15/24
Sort
Algoritmiieficientidesortareau,n*lognoperatii.Metodademaijos(bubblesort)esteineficientadeoarecearen^2operatii.Totusi,pentrusiruridelungimemica,numarulde
operatiiesteacceptabil.void interschimba(int *, int *);
void sort(int a[], int n) /*n este lungimea lui a[]*/
{
int i, j;
for (i = 0; i < n - 1; ++i)
for (j = n - 1; i < j; --j)
if (a[j - 1] > a[j])
interschimba(&a[j - 1], &a[j]);
}
15 Limbaje deprogramare Conf.dr.L. STOLERIU [email protected]
7/31/2019 Limbaj de programare C9
16/24
Sirurimultidimensionale
LimbajulCpermitesirurideoricetip,inclusivsiruride
siruri.
int a[100];
7/31/2019 Limbaj de programare C9
17/24
Siruribidimensionale
Presupunemcaavemunvector2dimensionalcu
elementeintregi.
int a[3][5];
Incepandcuadresadebaza,compilatorulvaalocaspatiu
continuupentru15intregi.Atunciputemgandiacest
vectorcaomatriceastfel:
17
col1 col2 col3 col4 col5
lin1 a[0][0] a[0][1] a[0][2] a[0][3] a[0][4]lin2 a[1][0] a[1][1] a[1][2] a[1][3] a[1][4]
lin3 a[2][0] a[2][1] a[2][2] a[2][3] a[2][4]
Limbaje deprogramare Conf.dr.L. STOLERIU [email protected]
7/31/2019 Limbaj de programare C9
18/24
Siruribidimensionale
Pentrua[i][j]avemexpresiile,deexemplu,echivalente:
*(a[i] + j)
(*(a + i))[j]*((*(a + i)) + j)
*(&a[0][0] + 5*i + j)
Putemgandi"a[i]"caa"i"acoloanaalui"a"si"a[i][j]"ca
elementuldinlinia"i",coloana"j"asirului
Numelesirului"a"estetotunacu"&a[0],siesteunpointercatreunsirde5intregi.Adresadebazaeste
"&a[0][0]",sinu"a".
18 Limbaje deprogramare Conf.dr.L. STOLERIU [email protected]
7/31/2019 Limbaj de programare C9
19/24
Siruribidimensionale
Candunvectormultidimensionalesteunparametruformalindefinitiauneifunctii,toatedimensiuniletrebuiespecificate,exceptandopeprima!
int suma(int a[][5]){
int i, j, suma = 0;
for (i = 0; i < 3; ++i)
for (j = 0; j < 5; ++j)suma += a[i][j];
return suma;
}
Urmatoareledeclaratiiarfiechivalenteinsuma :int a[][5] sau int (*a)[5] sau int a[3][5]
3poatefiutildoarprogramatorului,compilatorulnutinecontdeel.
19 Limbaje deprogramare Conf.dr.L. STOLERIU [email protected]
7/31/2019 Limbaj de programare C9
20/24
Siruribidimensionale
Potexistaconfuziiinlegaturacudeosebireadintreun
tabloubidimensionalsiuntabloudepointeri:
int a[10][10];
int *b[10];
utilizarilelui"a"si"b"potfisimilare,insensulcaa[5][5]si
b[5][5]potfiambelereferintelegalealeaceluiasi"int".
20 Limbaje deprogramare Conf.dr.L. STOLERIU [email protected]
7/31/2019 Limbaj de programare C9
21/24
Siruribidimensionale
Avantajepentruutilizareavectorilor(dezavantajepentrupointeri):
"a"esteuntablouintoataregula:toatecele100celule dememorietrebuiealocate,iarpentrugasireafiecaruielementsefacecalcululobisnuitalindicelui;
Prindeclararealui"b"sasealoca10pointeri;apoifiecaretrebuiefacutsapointezeuntabloudeintregi.Presupunindcafiecarepointeazacate10elementedintablou, atuncivomobtine100celuledememorierezervate,pluscele10celulepentrupointeri.Astfeltablouldepointeriutilizeaza sensibilmaimultspatiusipoatecereunprocedeuexplicitdeinitializare.
21 Limbaje deprogramare Conf.dr.L. STOLERIU [email protected]
7/31/2019 Limbaj de programare C9
22/24
Siruribidimensionale
Avantajepentruutilizareapointerilor(dezavantajepentru
vectori):
accesareaunuielementsefaceindirectprinintermediulunui
pointer,inlocsasefacaprininmultiresiadunare;
liniiletablouluipotfidelungimidiferite.Aceastainseamnaca
nuoriceelementalluibesteconstrinssapointezepeun
vectorde10elemente,uniipotpointapecate2elemente,altii
pecate20sialtiipeniciunul.
22 Limbaje deprogramare Conf.dr.L. STOLERIU [email protected]
7/31/2019 Limbaj de programare C9
23/24
Sirurimultidimensionale
Vectoriidedimensiunemaimaredecat3lucreazainmod
similarcuceibidimensionali.Dacaavemdeclaratia
int a[7][9][2];atuncicompilatorulvaalocaspatiupentru7*9*2intregi.
Adresadebazaasiruluieste"&a[0][0][0]",iarfunctiade
corespondentainmemorieestespecificatadea[i][j][k]careesteechivalentcu
*(&a[0][0][0] + 9*2*i + 2*j + k)
23 Limbaje deprogramare Conf.dr.L. STOLERIU [email protected]
7/31/2019 Limbaj de programare C9
24/24
Initializareasirurilor
int a[2][3] = {1, 2, 3, 4, 5, 6};
int a[2][3] = {{1, 2, 3}, {4, 5, 6}};
int a[][3] = {{1, 2, 3}, {4, 5, 6}};
Dacanusuntsuficienteelementecaresainitializezevectorul,atuncirestulelementelorsuntinitializatecu0.Unmodsimpludeainitializatotvectorulcu0:
int a[2][2][3] = {0};
Dacaprimacomponentalipseste,atuncicompilatorul
extragelungimeadinnumaruldeperechideacoladeinterioare.Urmatoareledeclaratiisuntechivalente:
int a[2][2][3] = {{{1,1,0}, {2,0,0}}, {{3,0,0}, {4,4,0}}};
int a[][2][3] = {{{1,1}, {2}}, {{3}, {4,4}}};
24 Limbaje deprogramare Conf.dr.L. STOLERIU [email protected]