Sunteți pe pagina 1din 5

======== Capitolul 4 ======== ========================= Functii si programare structurata ========================= Programarea structurata este o problema ce rezolva strategia si metodologia

programarii si are urmatoarele principii: 1. Structurile de control trebuie sa fie cat se poate de simple; 2. Constructia unui program trebuie sa fie descrisa top-down. Descrierea top-down se refera la descompunerea problemei noastre in subprobleme. De obicei aceste subprobleme sunt usor de descris. --------------------Apelul functiilor --------------------!n program este compus din una sau mai multe functii printre care si "main#$". %ntotdeauna e&ecutia unui program incepe cu "main#$". Cand o functie este apelata #sau invocata$ atunci controlul programului este pasat functiei apelate. Dupa ce aceasta isi termina e&ecutia atunci se paseaza inapoi controlul catre program. Codul C care descrie ce face o functie se numeste "definitia functiei". 'ceasta are urmatoarea forma generala: tip nume(functie #lista(parametri$ ) declaratii instructiuni * Primul rand se numeste "+eader-ul" #antetul$ functiei iar ceea ce este inclus intre acolade se numeste corpul functiei. Daca in antet nu precizam parametri atunci se va scrie "void" #cuvant rezervat pentru lista vida$. Daca functia nu intoarce nici o valoare atunci se va scrie ca tip intors tot "void". ,ipul intors de functie este cel precizat in "return" #ce va fi indata e&plicat$. Parametrii din antetul functiei sunt dati printr-o lista cu argumente separate prin virgula. 'ceste argumente sunt date de tipul argumentului urmat de un identificator ce apartine acelui tip. Se mai spune ca acel identificator este "parametru formal". -----------&emplu: ----------.include /stdio.+0 void tipareste(mesa1#int 2$ ) int i; printf#"%ti urez:3n"$; for #i 4 5; i / 2; 66i$ printf#" 7 zi buna 8 3n"$; * main#$ ) int n; printf#"Dati un numar natural mic: "$; scanf#"9d" :n$; tipareste(mesa1#n$; * ---------------------------Instructiunea "return" ---------------------------%nstructiunea "return" este folosita pentru doua scopuri. Cand se e&ecuta o instructiune "return" controlul programului este pasat inapoi programului apelant. %n plus daca e&ista o e&presie dupa acest "return" atunci se va returna valoarea acestei e&presii. %nstructiunea "return" poate avea formele: return; sau

return e&presie; -----------&emplu: ;inimul a doi intregi. ----------.include /stdio.+0 int min#int & int <$ ) if #& / <$ return &; else return < * main#$ ) int 1 2 m; printf#"Dati doi intregi: "$; scanf#"9d9d" :1 :2$; m 4 min#1 2$; printf#"3n9d este minimul dintre 9d si 9d.3n" m 1 2$; * -----------------------------Prototipurile functiilor -----------------------------%n C apelul unei functii poate apare inaintea declararii ei. =unctia poate fi definita mai tarziu in acelasi fisier sau in alt fisier sau dintr-o biblioteca standard. %n '>S% C prototipul functiei remediaza problema punand la dispozitie numarul si tipul argumentelor functiei. Prototipul specifica de asemenea si tipul returnat de functie. Sinta&a prototipului unei functii este: tip nume(functie #lista(tipuri(parametri$; %n lista de parametri putem specifica c+iar si parametrul dar asta este optional. Daca functia nu are parametri atunci se foloseste "void". -----------&emplu: ?eluam un e&emplu precedent. ----------.include /stdio.+0 main#$ ) int n; void tipareste(mesa1#int$; printf#"Dati un numar natural mic: "$; scanf#"9d" :n$; tipareste(mesa1#n$; * void tipareste(mesa1#2$ ) int i; printf#"%ti urez:3n"$; for #i 4 5; i / 2; 66i$ printf#" 7 zi buna 8 3n"$; * Prototipul unei functii poate fi plasat in corpul altei functii sau de regula se scriu la inceputul programelor dupa directivele .include si .define. ---------------------------Descriere "top-down" ----------------------------

Presupunem ca avem de citit cativa intregi si trebuie sa-i afisam in ordine pe coloane #in capatul de sus al coloanelor trebuie sa scriem numele campului$ sa le afisam suma lor partiala minimul si ma&imul lor. Pentru scrierea unui program C ce face acest lucru vom utiliza proiectarea #descrierea$ "top-down". 'stfel descompunem problema in urmatoarele subprobleme: 1. !n antet pentru problema data; 2. Scrierea campurilor; @. Citirea si scrierea lor pe coloane. ,oti acesti trei pasi vor fi descrisi in cate o functie ce se apeleaza din "main#$". 7btinem un prim cod: .include /stdio.+0 main#$ ) void tipareste(antet#void$; void scrie(campurile#void$; void citeste(scrie(coloanele#void$; tipareste(antet#$; scrie(campurile#$; citeste(scrie(coloanele#$; * 'ceasta reprezinta intr-un mod foarte simplu descrierea "top-down". Daca o problema este prea grea atunci o descompunem in subprobleme si apoi le rezolvam pe acestea. Aeneficiul suplimentar al acestei metode este claritatea sa. void tipareste(antet#void$ ) printf#"3n9s9s9s3n" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB3n" "B Calculul sumelor minimului si ma&imului B3n" "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB3n"$; * =unctia ce foloseste la scrierea campurilor este la fel usor de scris: void scrie(campurile#void$ ) printf#"9Cs912s912s912s912s3n3n" ">umar" "'rticol" "Suma" ";inimul" ";a&imul"$; * !rmeaza apoi functia ce serveste la scrierea inregistrarilor referitoare la campurile discutate mai sus: void citeste(scrie(coloanele#void$ ) int contor 4 5 articol suma minim ma&im; int min#int int$ ma&#int int$; if #scanf#"9d" :articol$ 44 1$ ) 66contor; suma 4 minim 4 ma&im 4 articol; printf#"9Cd912d912d912d912d3n3n" contor articol suma minim ma&im$; w+ile #scanf#"9d" :articol$ 44 1$ ) 66contor; suma 64 articol; minim 4 min#articol minim$; ma&im 4 ma&#articol ma&im$; printf#"9Cd912d912d912d912d3n3n" contor articol suma minim ma&im$; * * else

printf#">ici o data nu a fost citita.3n3n"$;

Daca datele se introduc de la tastatura atunci tabelul se va afisa "intrerupt" de citirile ce au loc de la tastatura. 'stfel se prefera citirea dintr-un fisier e&tern. Presupunem ca fisierul nostru e&ecutabil #asociat fisierului sursa scris in C$ se numeste "numere.e&e" si am creat un fisier numit "fisier.int" ce contine urmatoarele numere: 1D 2@ -E 2D -11 1E Dand comanda numere / fisier.int vom obtine un tabel ce contine toate datele dorite. ------------------------------------Invocare si apel prin valoare ------------------------------------7 functie este invocata prin scrierea numelui sau impreuna cu lista sa de argumente intre paranteze. De obicei numarul si tipul acestor argumente se "potriveste" cu parametrii din lista de parametri prezenti in definitia functiei. ,oate argumentele sunt apelate prin valoare #"call-b<-value"$. 'sta inseamna ca fiecare argument este evaluat si valoarea sa este folosita ca valoare pentru parametrul formal corespunzator. De aceea daca o variabila #argument$ este folosita la transmiterea unei valori atunci valoarea ei nu se sc+imba. -----------&emplu: ----------.include /stdio.+0 main#$ ) int n4@ suma calculeaza(suma#int$; printf#"9d3n" n$; FB se va scrie @ BF suma 4 calculeaza(suma#n$; printf#"9d3n" n$; FB se va scrie @ BF printf#"9d3n" suma$; FB se va scrie G BF * int calculeaza(suma#int n$ FB suma numerelor de la 1 la n BF ) int suma 4 5; for # ; n 0 5; --n$ FB n se sc+imba aici dar nu si in main#$ BF sum 64 n; printf#"9d3n" n$; FB se va scrie 5 BF return suma; * C+iar daca n este trimis ca argument in functia "calculeaza(suma#$" si valoarea lui n se modifica in aceasta functie valoarea sa din mediul apelant ramane nesc+imbata. Hom vedea mai tarziu cum se poate simula apelul prin adresa #"call-b<-reference"$. ---------------------------------------------Deosebirea dintre "return" si "exit" ----------------------------------------------&ista doua procedee de a returna o valoare. return e&presie si e&it#e&presie$

Daca se folosesc in "main#$" atunci acestea sunt ec+ivalente dar in orice alta functie efectul lor este diferit #in '>S% C functia "main#$" intoarce o valoare de tip int$. !n apel al lui e&it#$ in orice alta functie va implica terminarea e&ecutiei programului si returnarea valorii catre mediul apelant #sistemul de operare sau mediul de programare C$. Haloarea returnata se numeste stare de iesire #"e&it status"$. Prin conventie starea de iesire zero indica terminare cu succes pe cand iesire cu un numar diferit de zero indica o situatie anormala. ----------------------------------------------xercitii propuse spre implementare -----------------------------------------------

1. =olosind functiile "rand#$" "min# $" si "ma&# $" sa se genereze n numere naturale si sa se afiseze minimul si ma&imul dintre acestea. 2. #Iocul cap-pa1ura simulare ;onte-Carlo$ Presupunem ca dispunem de o moneda ideala #nemasluita$. Doi 1ucatori arunca cu moneda dupa urmatoarele reguli: 1.a. Se fac un numar total de n aruncari; 1.b. Primul 1ucator arunca moneda si celalalt spune "cap" sau "pa1ura"; 1.c. Daca acesta "g+iceste" ce va pica moneda atunci se inverseaza 1ucatorii #adica arunca al doilea si primul incearca sa g+iceasca$; 1.d. Ja sfarsit trebuie afisat scorul #si procentul de castig al fiecaruia$. @. #Con1ectura lui Koldbac+$ 7rice numar par mai mare decat 2 se poate scrie ca suma a doua numere prime. Scrieti un program C care verifica aceasta con1ectura pentru numere situate intre m si n. De e&emplu daca m4E55 si n41155 atunci afisati: E55 4 1E 6 GL@ E52 4 11 6 GD1 E5M 4 @ 6 E51 ... 15DL 4 C 6 15D@ 1155 4 @ 6 15DE Keneralizare: Scrieti toate combinatiile posibile de adunare a doua numere prime egal cu un numar dat.

S-ar putea să vă placă și