Limbaj de programare C9

download Limbaj de programare C9

of 24

Transcript of Limbaj de programare C9

  • 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]