programarea calculatoarelorcap 6

Upload: pstraja

Post on 30-May-2018

214 views

Category:

Documents


0 download

TRANSCRIPT

  • 8/14/2019 programarea calculatoarelorCap 6

    1/16

    Funcii.

    CAPITOLUL 6

    FUNCII

    Funcia este o unitate lexical de program compilabil independent. Exist funciipredefinite i funcii definite de programator.

    Structura unei funciieste prezentat urmtoarea:tip nume(lista parametrilor formali){ declaraii de variabile locale

    instruciuni}

    unde: - tip reprezint tipul valorii returnate de funcie;- nume este un identificator pentru numele funciei;- lista parametrilor formali- nume de variabile sau expresii separate prin virgul.

    Observaie: Dac lista este vid parantezele rotunde tot apar.

    Funciile pot fi de dou tipuri:- funcii care returneaz o valoare;- funcii care nu returneaz nici o valoare;

    Observaii: - dac funcia nu returneaz nici o valoare, pentru tip se folosete cuvntulcheie void;

    - dac "tip"este absent, se presupune c funcia sau nu returneaz nicivaloare sau returneaz o valoare de tip int.

    Apelul i revenirea dintr-o funcie

    Apelul unei funcii

    a) Dac funcia nu returneaz nici o valoare atunci ea se apeleaz printr-oinstruciune deapel:

    nume_funcie(lista parametrilor efectivi);unde lista parametrilor efectivi conine un numr de parametrii egal cu cei din listaparametrilor formali, de acelai tip i n aceeai ordine.

    b) Dac funcia returneaz o valoare atunci ea poate fi apelat fie printr-oinstruciune deapel, fie sub forma unui operand al unei expresii.

    Prototipul unei funciiO funcie poate fi apelat dac ea este definit n fiierul surs nainte de a fi apelat.

    Cnd nu este posibil acest lucru apelul funciei trebuie precedat de prototipul ei.Format 1 tip nume(lista declaraiilor de parametrii);Format 2 tip nume(lista tipurilor parametrilor);Format 3 tip nume(void);Format 4 tip nume( );

    Observaie: cele dou liste: lista parametrilor formali i lista parametrilor efectivitrebuie s coincid ca numr, ordine i tip.

    Apel prin valoare i apel prin referinLa apelul unei funcii fiecrui parametru formal i se atribuie valoarea parametrului

    efectiv care-i corespunde; deci, la apelul unei funcii, se transfer valorile parametrilorefectivi . n acest caz avem apel prin valoare.

    99

  • 8/14/2019 programarea calculatoarelorCap 6

    2/16

    Funcii.

    n anumite limbaje de programare la apel nu se transfer valorile parametrilor efectivi ciadresele acestora. n acest caz avem apel prin referin.

    Revenirea dintr-o funcie

    Se poate realiza n dou moduri:- la ntlnirea instruciunii return;- dup execuia ultimei sale instruciuni.

    Instruciunea return:Format 1: return;Format 2: return expresie;

    Primul format se utilizeaz cnd funcia nu returneaz nici o valoare. Al doilea format seutilizeaz atunci cnd funcia returneaz o valoare.

    Aplicaia 1: Se citesc numerele reale pn la introducerea valorii 0. S se determine:

    - toate tripletele de numere citite consecutiv pentru care al treilea numr este egal cuprimul numr ridicat la puterea dat de al doilea numr;

    - toate numerele ptrate perfecte aflate pe poziii multiplu de trei;- logaritmul natural din valoarea absolut a sumei elementelor aflate n ir pe poziii

    multiplu de 4.Specificatia problemei:

    Date de intrare: x[0],x[1],x[2], - ir de numere reale.Date de ieire: (x[i],x[i+1],x[i+2]), { } Ni ,...2,1,0 - triplete de numere citite

    consecutivx[i], { } Ni ,...2,1,0 - nr.ptrat perfect;l - logaritm natural din valoarea absolut a sumei elementelor de

    pe poziii multiplu de 4.Date de test: x[0]= -5.42

    x[1]= 2x[2]= 4x[3]=16x[4]=2.71x[5]=1x[6]=9x[7]=1x[8]=0Tripletele de numere sunt:

    2.0 4.0 16.01.0 9.0 1.0

    Numerele ptrate perfecte sunt:16.0 9.0

    Logaritmul natural este:1.00

    Algoritmul problemei:Funcia citire( ) este:

    i0citete x[0]ct timp x[0]0 execut

    100

  • 8/14/2019 programarea calculatoarelorCap 6

    3/16

    Funcii.

    ii+1citete x[i]

    sfrsit ct timpcitirei

    sfrsit citireSubalgoritmul putere(a,m) este:

    pentru i0,m-3 executdac a[i+2]=a[i] a[i+1]

    atunci scrie a[i],a[i+1],a[i+2]sfarit dac

    sfrit pentrusfrit putereSubalgoritmul ptrat(a,m) este:

    i0ct timp (i

  • 8/14/2019 programarea calculatoarelorCap 6

    4/16

    Funcii.

    return i;}void putere(float a[], int m){ int i;for (i=0;i

  • 8/14/2019 programarea calculatoarelorCap 6

    5/16

    Funcii.

    - se iniializeaz variabila i cu valoarea zero; n final aceast variabil va precizadimensiunea tabloului;

    - se citete prima valoarea folosind funcia scanf;- n cadrul unei structuri repetitive cu test iniial se verific dac valoarea citit este

    diferit de zero; n caz afirmativ se incrementeaz valoarea variabilei i i se citete o nouvaloare folosind aceeai funcie scanf.

    - cnd valoarea citit este zero se prsete structura repetitiv i se returneazdimensiunea tabloului unidimensional dat de valoarea variabilei i.

    Funcia putere are doi parametrii formali: un tablou unidimensional de numerereale i variabil ntreag reprezentnd dimensiunea tabloului; funcia nu returneaz nici ovaloare, deci este de tip void. Aceast funcie afieaz toate tripetele de elemente consecutivepentru care al treilea numr este egal cu primul numr ridicat la puterea dat de al doileanumr.

    Pentru determinarea acestor triplete se acceseaz toate tripletele de numere aflate pepoziii consecutive n tablou i pentru fiecare triplet se verific dac ndeplinete condiiacerut prin intermediul funciei predefinite pow; n caz afirmativ se afieaz tripletul respectiv.

    Funcia patrat are doi parametrii formali: un tablou unidimensional de numerereale i variabil ntreag reprezentnd dimensiunea tabloului; funcia nu returneaz nici o

    valoare, deci este de tip void. Aceast funcie determin i afieaz toate numerele ptrateperfecte situate n tablou pe poziii multiplu de trei astfel:

    - se acceseaz toate elementele din tablou situate n ir pe poziii multiplu de trei;- pentru fiecare numr accesat se verific dac acesta este pozitiv i dac rdcina

    ptrat a acestui numr este o valoare ntreag, verificarea fcndu-se prin intermediulfunciilor predefinite sqrt i floor;

    - dac ambele condiii sunt adevrate atunci se afieaz elementul respectiv altabloului.

    Funcia lognat are doi parametrii formali: un tablou unidimensional de numerereale i variabil ntreag reprezentnd dimensiunea tabloului. Aceast funcie returneaz ovaloare real reprezentnd logaritmul natural din valoarea absolut a elementelor aflate n ir

    pe poziii multiplu de 4.Pentru determinarea acestei valori se procedeaz astfel:- se iniializeaz variabilele i i s cu valoarea zero; variabila i se folosete pentru a

    accesa elementele din tablou situate pe poziii multiplu de 4, iar variabila s se folosete pentrua calcula suma elementelor accesate prin intermediul variabilei i;

    - utiliznd o structur repetitiv cu test iniial se calculeaz suma elementelor situaten ir pe poziii multiplu de 4;

    - n final se returneaz logaritmul natural din valoarea absolut a sumei dat devariabila s.

    n corpul funciei principale se declar o variabil de tipul int ce va avea ca valoaredimensiunea tabloului de numere reale.

    n cadrul unei expresii variabila n primete valoarea returnat de apelul funcieicitire(), semnificnd numrul de elemente nenule din tablou. n acest caz funcia este apelatca operand n cadrul unei expresii.

    Pentru afiarea tuturor tripletelor de numere citite consecutiv pentru care al treileanumr este egal cu primul numr ridicat la puterea dat de al doilea numr se apeleaz funciaputere(x,n) ce are ca parametrii actuali tabloul unidimensional x i dimensiunea acestuia datde n.

    Pentru afiarea tuturor numerelor ptrate perfecte aflate pe poziii multiplu de trei seapeleaz funcia patrat(x,n) ce are ca parametrii actuali tabloul unidimensional x idimensiunea acestuia dat de n.

    103

  • 8/14/2019 programarea calculatoarelorCap 6

    6/16

    Funcii.

    Apelul funciilor putere(x,n) i patrat(x,n) se realizeaz prin intermediul uneiinstruciuni de apel.

    Funcia lognat(x,n) ce determin logaritmul natural din valoarea absolut a sumeielementelor aflate n ir pe poziii multiplu de 4 se apeleaz ca argument al funciei printf.Aplicaia 2.

    Se cunoate un numr natural n. S se verifice dac numrul dat este prim, palindromsau perfect. S se determine factorii primi ai si i suma numerelor perfecte mai mici decat n.Specificaia problemei:

    Date de intrare: n - numrul natural.Date de iesire: d1, d2, , dk - factorii primi ai lui n;

    s - suma numerelor perfecte mai mici dect n.Date de test: n=11

    Numrul 11 este primNumrul 11 este palindromNumrul 11 nu este perfectDescompunerea n factori primi a lui 1111Suma numerelor perfecte mai mici decat 11 este: 6

    Sau :n=28Numrul 28 nu este primNumrul 28 nu este palindromNumrul 28 este perfectDescompunerea n factori primi a lui 282 2 7Suma numerelor perfecte mai mici decat 28 este: 6

    Algoritmul probl emei :Funcia prim(m) este:

    cod1

    i2ct timp (i0)execut

    rr *10 + p mod 10pp div 10sfrit ct timpdac (m=r) atunci cod1

    altfel cod0sfrit dacpalindromcod

    sfrit palindromFuncia perfect(m) este:

    s0

    104

  • 8/14/2019 programarea calculatoarelorCap 6

    7/16

    Funcii.

    pentru i1,[m/2] executdac (m mod i=0) atunci ss+isfrit dac

    sfrit pentrudac (m=s) atunci cod1

    altfel cod0sfrit dac

    perfectcodsfrit perfectSubalgoritmul desc_factori_primi(m) este:

    d2scrie "Descompunerea n factori primi"ct timp (m>1) execut

    dac ( prim(d)=1) atuncict timp( m mod d = 0) execut

    scrie dmm div d

    sfrit ct timp

    sfrit dacdd+1

    sfrit ct timpsfrit subalgoritmFuncia suma (m) este:

    s0pentru i2,m-1 execut

    dac (perfect(i)=1) atunci ss+isfrit dac

    sfrit pentrusumas

    sfrit sumaAlgoritmul numr este:

    scrie n=citete ndac (prim(n)=1) atunci Scrie Numarul, n, este prim

    altfel Scrie Numarul, n, nu este primsfrit dacdac (palindrom(n)=1) atunci Scrie Numarul, n, este palindrom

    altfel Scrie Numarul, n, nu este palindromsfrit dacdac (perfect(n)=1) atunci Scrie Numarul, n, este perfect

    altfel Scrie Numarul, n, nu este perfectsfrit dacdesc_factori_primi(n)scrie Suma numerelor perfecte mai mici dect, n, este, suma(n))

    sfrit algoritmProgramul corespunztor algoritmului este:

    #include #include int prim(unsigned m)

    { int cod=1;

    105

  • 8/14/2019 programarea calculatoarelorCap 6

    8/16

    Funcii.

    unsigned i=2;while ((i

  • 8/14/2019 programarea calculatoarelorCap 6

    9/16

    Funcii.

    if (palindrom(n)) printf("\nNumarul %u este palindrom",n);else printf("\nNumarul %u nu este palindrom",n);

    if (perfect(n)) printf("\nNumarul %u este perfect",n);else printf("\nNumarul %u nu este perfect",n);

    desc_factori_primi(n);printf("\nSuma numerelor perfecte mai mici decat %u este %u",n,suma(n));getch();

    }Analiza programului:

    Funcia prim verific dac numrul transmis ca parametru este sau nu prim ireturneaz valoarea 1 dac numrul este prim sau valoarea 0 n caz contrar. Pentru verificarese parcurg urmtoarele etape:

    - se presupune c numrul este prim; n acest caz variabila cod se iniializeaz cuvaloarea 1;

    - n cadrul unei structuri repetitive cu test iniial se acceseaz numere cuprinsentre 2 i jumtatea numrului transmis ca parametru ct timp numrul este considerat prim,adic nu s-a gsit nc nici un divizor propriu;

    - pentru numrul accesat se verific dac este divizor pentru numrul dat; dac

    da atunci numrul dat ca parametru nu este prim , variabila cod primind valoarea 0;- n final se returneaz valoarea variabilei cod; dac nu s-a gsit nici un divizor

    propriu atunci valoarea returnat este 0 , in caz contrar se returneaz valoarea 0.Funcia palindrom verific dac numrul transmis ca parametru este sau nu

    palindrom i returneaz valoarea 1 dac numrul este palindrom sau valoarea 0 n caz contrar.Pentru verificare se parcurg urmtoarele etape:

    - variabila r care va conine inversul numrului transmis ca parametru seiniializeaz cu valoarea 0;

    - valoarea transmis ca parametru se atribuie variabilei p;- ct timp valoarea variabilei p este diferit de 0 se execut urmtoarele atribuiri:

    valoarea dat de variabila r se nmulete cu 10 i se adun cu restul mpririi valorii date de

    variabila p prin 10, adic cu ultima cifr a valorii lui p, rezultatul reinndu-se n variabila r;apoi se modific valoarea variabilei p aceasta fiind egal cu ctul mpririi vechii valori la10;

    - la ieirea din structura repetitiv variabila r va avea ca valoare inversulnumrului transmis ca parametru;

    - n final se verific dac inversul numrului transmis ca parametru este egal cunumrul dat; dac condiia este adevrat atunci numrul este palindrom i variabila codprimete valoarea 1; n caz contrar numrul nu este palindrom i variabila codprimetevaloarea 0. Se returneaz valoarea variabilei cod.

    Funcia perfect verific dac numrul transmis ca parametru este sau nu perfect ireturneaz valoarea 1 dac numrul este perfect sau valoarea 0 n caz contrar. Pentru

    verificare se parcurg urmtoarele etape:- variabila s care va conine suma divizorilor numrului transmis ca parametru, maipuin el nsui, se iniializeaz cu valoarea 0;

    - n cadrul unei structuri repetitive cu numr fixat de pai se acceseaz numerecuprinse ntre 1 i jumtatea numrului transmis ca parametru; pentru fiecare numr accesatse verific dac reprezint un divizor pentru numrul dat ca parametru; n caz afirmativ seadaug la sum;

    - la ieirea din structura repetitiv variabila s va avea ca valoare suma divizorilornumrului transmis ca parametru, mai puin el nsui;

    107

  • 8/14/2019 programarea calculatoarelorCap 6

    10/16

    Funcii.

    - n final se verific dac numrului transmis ca parametru este egal cu suma dat devariabila s; dac condiia este adevrat atunci numrul este perfect i variabila cod primetevaloarea 1; n caz contrar numrul nu este perfect i variabila codprimete valoarea 0. Sereturneaz valoarea variabilei cod.

    Funcia desc_factori_primi determin i afieaz toi factorii primi ai numruluitransmis ca parametru. Funcia nu returneaz nici o valoare, fiind de tip void. Factorii primise determin se astfel: n cadrul unei structuri repetitive cu test iniial se acceseaz numerecuprinse ntre 2 i jumtatea numrului transmis ca parametru; pentru fiecare numr accesatse verific dac acesta este prim, apelnd funcia prim(d), apoi dac reprezint un factorpentru numrul transmis ca parametru; dac ambele condiii sunt ndeplinite se afieazfactorul prim i se modic valoarea variabilei ce coninea numrul transmis ca parametru.

    Funcia suma calculeaz suma numerelor perfecte mai mici dect numrultransmis ca parametru i returneaz valoarea acestei sume.

    Pentru determinarea sumei se parcurg urmtoarele etape:- variabila s care va conine suma numerelor perfecte mai mici dect numrul

    transmis ca parametru se iniializeaz cu valoarea 0;- n cadrul unei structuri repetitive cu numr fixat de pai se parcurg toate numerele

    naturale de la 1 pn la valoarea transmis de parametru minus 1;

    - se verific dac numrul natural accesat este perfect, apelnd funcia perfect(i), iardac condiia este ndeplinit atunci numrul natural se adaug la sum;

    - n final se returneaz valoarea variabilei s, adic suma numerelor perfecte maimici dect numrul transmis ca parametru.

    n corpul funciei principale se declar variabila n de tip unsigned reprezentndnumrul natural a crui valoare se citete folosind funcia scanf.

    Pentru a verifica dac numrul natural citit este : prim, palindrom sau perfect seapeleaz funciile: prim(n), palindrom(n) i perfect(n) care returneaz fie valoare 1 fievaloarea 0. n funcie de valoarea returnat se afieaz un mesaj corespunztor.

    Pentru afiarea factorilor primi ai numrului natural dat de variabila n se apeleazfuncia desc_factori_primi(n), avnd ca parametru actual numrul pentru care se determin

    factorii primi.Pentru afiarea sumei numerelor perfecte mai mici dect valoarea dat de variabila n

    se apeleaz funcia suma(n) ca argument al funciei printf.Pentru funcia desc_factori_primi, ce nu returneaz nici o valoare, apelul ei are loc

    ntr-o instruciune de apel. n cazul celorlalte funcii, care returneaz valori, apelul serealizeaz ca operand n cadrul unei expresii.

    Se observ c o funcie poate fi apelat att din funcia principal ct i din altefuncii. Spre exemplu funciile prim i perfect au fost apelate att din funcia principal, cti din funciile desc_factori_primi, respectiv suma. n acest program, nainte de a fiapelate, toate funiile au fost implementate.

    Pentru c toate funciile au ca parametru formal o variabil de tip unsigned,

    transmiterea parametrilor are loc prin valoare. n acest caz parametrul formal primetevaloarea parametrului actual, dar nu poate modifica valoarea parametrului actual neavndacces la adresa de memorie a acestuia. Spre exemplu valoarea parametrului actual n setransmite parametrului formal m la apelul funciei desc_factori_primi. n corpul acesteifuncii se modific valoarea parametrului formal m prin mpriri succesive la 10, darvaloarea parametrului actual n nu poate modific pentru c funcia desc_factori_primi nuare acces la adresa acestuia.

    108

  • 8/14/2019 programarea calculatoarelorCap 6

    11/16

    Funcii.

    Aplicaia 3:Se citesc cele n elemente, numere naturale, ale unui ir. S se determine:

    - suma elementelor pare ce preced minimul irului;- produsul elementelor impare ce preced maximul irului;- valoarea minim impar;- valoarea maxim par.

    S se construiasc irul yi==

    i

    jjx

    0 ; unde i { }1,...,1,0 n .Specificaia problemei:

    Date de intrare: n - numrul elementelor tabloului unidimensional;x[0], x[1], , x[n-1] - elementele tabloului unidimensional.

    Date de iesire: min - valoarea minim impar;max - valoarea maxim par;s - suma elementelor pare ce preced minimul irului;p - produsul elementelor impare ce preced maximul irului;y[0], y[1], , y[n-1] - elementele noului tabloul unidimensional.

    Date de test: n=8

    Introduceti elementele siruluix[0]= 5x[1]= 12x[2]= 3x[3]=14x[4]=21x[5]=7x[6]=2x[7]=16Valoarea minima impara: 3Valoarea maxima para: 16

    Suma elementelor pare ce preced minimul sirului: 26Produsul elementelor impare ce preced maximul sirului: 15Noul sir este:5 17 20 34 55 62 64 80

    Algoritmul problemei:Subalgoritmul citire() este:

    scrie n=citete nscrie Introducei elementele iruluipentru i0, n-1 execut

    scrie x[,i,]=

    citete x[i]sfrit pentrusfrit citireSubalgoritmul afisare(a,m) este:

    pentru i0, m-1 executscrie a[i]

    sfrit pentrusfrit afisareFuncia minimpar(a,m) este:

    i0

    109

  • 8/14/2019 programarea calculatoarelorCap 6

    12/16

    Funcii.

    ct timp (i

  • 8/14/2019 programarea calculatoarelorCap 6

    13/16

    Funcii.

    produspsfrit produsSubalgoritmul construire(a,m) este:

    y[0] a[0]pentru i1, m-1 execut

    y[i] y[i-1]+a[i]sfrit pentruscrie Noul sir esteafisare(y,m)

    Sfrit construireAlgoritmul ir este:

    citire( )scrie "Valoarea minima impara:", minimpar(x,n)scrie "Valoarea maxima para:", maxpar(x,n)scrie "Suma elementelor pare ce preced minimul sirului: ", suma(x,n)scrie "Produsul elementelor impare ce preced maximul sirului: ", produs(x,n)construire(x,n)

    sfrit algoritm.Programul corespunztor algoritmului este:

    #include #include int n;unsigned x[20];void citire();void afisare(unsigned a[], int m);unsigned minimpar(unsigned a[],int m);unsigned maxpar(unsigned a[],int m);unsigned suma(unsigned a[],int m);unsigned produs(unsigned a[],int m);

    void construire(unsigned a[],int m);void main(){ citire();printf("\nValoarea minima impara: %u",minimpar(x,n));printf("\nValoarea maxima para: %u",maxpar(x,n));printf("\nSuma elementelor pare ce preced minimul sirului: %u",suma(x,n));printf("\nProdusul elementelor impare ce preced maximul sirului: %u",

    produs(x,n));construire(x,n);

    getch();}

    void citire(){ int i;printf("n=");scanf("%d",&n);printf("Introduceti elementele sirului\n");for (i=0;i

  • 8/14/2019 programarea calculatoarelorCap 6

    14/16

    Funcii.

    for (i=0;i

  • 8/14/2019 programarea calculatoarelorCap 6

    15/16

    Funcii.

    unsigned y[20];y[0]=a[0];for (i=1;i

  • 8/14/2019 programarea calculatoarelorCap 6

    16/16

    Funcii.

    - valoarea dat de variabila s se aduncu valoarea elementului accesat, dac acestaeste par, i rezultatul se atribuie variabilei s;

    - la final se returneaz valoarea variabilei s ce va conine suma elementelor dintabloul unidimensional ce preced minimul .

    Funcia produs are doi parametri formali: un tablou unidimensional de numerentregi i o variabil de tip int reprezentnd dimensiunea acestuia. Funcia calculeaz ireturneaz produsul elementelor impare din tablou ce preced maximul irului, parcurgndurmtoarele etape:

    - se determin valoarea maxim din tablou, reinndu-se poziia acestei valori dintablou n variabila k;

    - se acceseaz toate elemnetele din tablou de la elementul situat pe poziia 0 pn lacel situat pe poziia k-1, adic acel element care precede maximul tabloului.

    - valoarea dat de variabila p se nmulete cu valoarea elementului accesat, dacacesta este impar, i rezultatul se atribuie variabilei p;

    - la final se returneaz valoarea variabilei p ce va conine produsul elementelor dintabloul unidimensional ce preced maximul.

    Funcia construire are doi parametri formali: un tablou unidimensional denumere ntregi i o variabil de tip int reprezentnd dimensiunea acestuia; nu returneaz nici

    o valoare, deci este de tip void. n corpul acestei funcii se determin elementele nouluitablou, observnd c fiecare element se obine din cel anterior plus elementul din primultablou de pe aceeai poziie, i se afiseaz acest nou tablou apelnd funcia de afiare avndca parametri actuali noul ir i dimensiunea acestuia: afisare(y,m).

    n corpul funciei pricipale se apeleaz funciile: citire() i construire() utilizndinstruciuni de apel; funciile: minimpar(x,n), maxpar(x,n), suma(x,n) i produs(x,n) seapeleaz ca argumente ale funciei printf.

    114