Subprograme Notiunea de subprogram Programele se pot ...informatik.ddbuftea.ro/subprograme.pdf ·...
Transcript of Subprograme Notiunea de subprogram Programele se pot ...informatik.ddbuftea.ro/subprograme.pdf ·...
• Subprograme
• Notiunea de subprogram
Definiţie Programele se pot descompune in subprobleme (module), adica in
grupe de actiuni care se pot repeta de cate ori se face aplelul in functia
principala int main()
Subprogramele sunt unităţi de program care:
1.au un algoritm propriu
2.pot fi scrise independent
3.pot fi compilate independent
4. se pot executa doar la apel de functie
1)Un program scris în limbajul C++ este un ansamblu de funcţii
2) fiecare dintre acestea efectuând o activitate bine definită.
1) Doar funcţia main() este rădăcină sau funcţie principală - adică nu poate lipsi
1. descompunerea in subprobleme
2. reutilizarea codului - subprogramul odată scris poate fi apelat şi în alte
programe
3. reducerea numărului de erori care apar la scrierea programului
4. depistarea şi corectarea cu uşurinţă a erorilor
5. realizarea unor programe uşor de urmărit.
Avantajele utilizării
subprogramelor
1
• Subprograme
standard(includerea fisierelor de tip antet: cmath.
Stdio.h)
• Subprograme definite de utilizator(definite de programator pentru rezolvarea unei cerinte)(nr prime, cmmdc,prelucrarea cifrelor unui numar)
• Functii cu tip sau subprograme apelate ca operanzi (functii cu tip de data ( int, float) ce vor returna un rezultat prin apelul numelui (in interiorul unei expresii)
3
• Subprograme apelate ca instructiuni procedurale (functiivoid)apelul se face prin nume_functie si parametrii (clrscr(), getch() )
2
Program fara
subprogramC++
#include
<iostream>
using namespace
std;int main(){
cout << “\n acesta este o comanda de
afisare”;return 0;
}
Program cu
subprogram
#include
<iostream> using
namespace std;
void mesaj()
{cout << “\n acesta este o comanda de
afisare" ;
}
int main()
{
mesaj()
;
return
0;
}
Declararea si definirea unei functii
Definiţia conţine antetul funcţiei şi corpul acesteia. Nu este admisă definirea unei funcţii în corpul altei funcţii.
tip_returnat nume_funcţie (lista parametrilorformali)
{
//antet
instrucţiune compusă; // corpul funcţiei
}
Tip_returnat
• O funcţie returnează cel mult un rezultat
•(int sau float) reprezintă tipul rezultatului calculat şi returnat de funcţie, corpul
funcţiei trebuie să conţină cel puţin o instrucţiune returnexpresie
• tipul void –functia nu are comanda RETURN expresie;
Nume_funcţie Un identificator ce reprezintă numele dat funcţiei de către cel ce o defineşte, pentru a o putea apela.
Lista parametrilor
formali
Reprezintă o listă de declaraţii de parametri formali, separaţi prin virgulă:
tip_parametru1 nume_parametru1,..., tip_parametruN nume_parametruN
Această listă poate să fie şi vidă.
Instrucţiune
compusăPoate conţine declaraţii de variabile (variabile locale) şi instrucţiunipropriu-zise.
MODUL APELANT( CONTINE APELUL
FUNCTIEI)
MODUL APELAT( CORPUL
FUNCTIEI)
APELUL FUNCTIEI (SE POATE
APELA DE CATE ORI
DORIM)
Variabile locale si globale
segment de date / zona statică
segment stivă / zona stivă
zona heap
Sistemul de operare alocă fiecărui program trei zone distincte în memoria internă în
care se găsesc memorate variabilele programului.
O variabilă se caracterizează prin 4 atribute:
1.Clasa de memorare precizează locul unde este memorată variabila respectivă.
O variabilă poate fi memorată în segmentul de date, în cel de stivă, în heap(structura
arborescenta) sau într-un registru al microprocesorului
2. Vizibilitate
Precizează liniile textului sursă din care variabila respectivă poate fi accesată.
Astfel avem: 1.Vizibilitate la nivel de bloc (instrucţiune compusă);
2.Vizibilitate la nivel de fişier – în cazul în care programul ocupă un singur fişier
sursă;
3.Vizibilitate la nivel de clasă – este în legătură cu programarea pe obiecte.
3.Durata de viaţă reprezintă timpul în care variabila respectivă are alocat spaţiul în
memoria internă. Astfel avem:
1. Durata statică (Globală)– variabila are alocat spaţiu în tot timpul execuţiei
programului
2. Durata locală – variabila are alocat spaţiu în timpul în care se execută
instrucţiunile
blocului subprogramului
3. Durată dinamică – alocarea şi dezalocarea spaţiului necesar variabilei respective
se face de către programator prin operatori sau funcţii speciale.
4. Tipul variabilei : int, float, char
Daca in int main ()
{int a=5; //se aloca un spatiu de 4 octeti
Float b=7; //b ocupa 4 octeti
Double d=2; //d ocupa 8
octeti Char c=‘x’;
// c ocupa 1 octet
Cout<<“tipul int ocupa ”<<sizeof(int)<<“octeti”;
Cout<<“tipul int float ”<<sizeof(float)<<“octeti”;
Cout<<“tipul int ocupa
”<<sizeof(double)<<“octeti”; Cout<<“tipul int
ocupa ”<<sizeof(char)<<“octeti”;
}
Ce inseamna alocare statica si alocare
dinamicaOrice functie ocupa o zona de memorie:
Pentru a vedea cati octeti ocupa o variabila putem aplica operatorul sizeof
(tip_data)
Bit
Are valoarea
binara 0 sau 1
1 octet=8 biti0 0 0 0 0 0 0 1
0 0 0 0 0 0 1 0
0 0 0 0 0 0 1 1
0 0 0 0 0 1 0 0
f f f f f f f f
27 26 25 24 23 22 21 20
In hexa-zecimal :
FFFFFFFF == 4.294.967.295
Pentru var a
sunt alocati
4 octeti
Se deschide aplicatia CALCULATOR in modul de vizualizare VIEW
PROGRAMMER
-se scriu valorile in sistem zecimal
-Se transforma suma obtinuta in sistem binar , octal sau hexazecimal
-Se stie ca 13 din zecimal in binar este 1101
- 1310= 11012
-In sistem OCTAL se grupeaza cate trei biti pentru numarul scris in
BINAR 132= 158
27 26 25 24 23 22 21 20
0 0 0 0 1 1 0 1
13 = 8 + 4 + 0 + 1
23 22 20 22 21 20 22 21 20
0 0 0 0 1 1 0 1
13 = 1 5
-In sistem HEXAZECIMAL se
grupeaza cate 4 biti…valoarea
obtinuta este de la 0 pana la 15
-Pentru valorile 10A
-
-
-
-
-
11B
12C
13D
14E
15F
20 23 22 21 20 23 22 21 20
0 0 0 0 1 1 0 1
13 = D
Ce inseamna sistem binar, octal si hexazecimal
4octet
i
4octeti
8octeti
Struct ex
{int a;
Char *p;
Double
b;
} y;
0 0 0 0 0 0 0 1
0 0 0 0 0 0 1 0
0 0 0 0 0 0 1 1
0 0 0 0 0 1 0 0
f f f f f f f f
27 26 25 24 23 22 21 20
In cazul in care definim o structura de date si aplicam operatorul sizeof(y) , va
afisa 16 octeti;
0 0 0 0 0 0 0 1
0 0 0 0 0 0 1 0
0 0 0 0 0 0 1 1
0 0 0 0 0 1 0 0
*p
Arata la ce
adresa va
memora
un sir de
char
Fiecare octet are o adresa &p
*Pointer== retine adresa unde se memoreaza datele alocate
dinamic
Diferente intre STIVA si zona de manevra HEAP
STIVA HEAP
•Variabilele sunt alocate de
compilator si distruse dupa rularea
programului
•Alocarea este mult mai rapida
•Se foloseste principiul STIVEI
(LIFO=Last In is First Out)
•Datele se pot folosi fara pointeri
•Variabilele folosesc dimensiune
maxima de la inceputul programului
•Durata de viata a variabilelor incepe de la
momentul creerii , printr-o functie de alocare
dinamica MALLOC() si tine pana in momentul
eliberarii memoriei prin functia FREE()
•Alocarea memoriei este mai lenta decat la stiva
•Datele create pe heap vor avea pointeri care le
corespund (* pointer si & adresa)
•Se foloseste cand nu stim de la inceput de cat
spatiu de memorie avem pentru un anumit scop
*p Structura de date
• Se declară în afara corpului oricărei funcţii.
• Pot fi utilizate de toate funcţiile care urmează în textul sursă declaraţiei variabilei respective.
• La declarare, variabilele globale sunt iniţializate implicit cu 0.
• Atributele variabilelor globale sunt:
1) Clasa de memorare – segmentul de date.
2)Durata de viaţă a variabilelor globale este statică. Ele au spaţiul de memorie rezervat în
tot timpul execuţiei programului.
3)Vizibilitatea – În cazul în care declaraţiile acestora sunt înaintea tuturor funcţiilor, ele
sunt vizibile la nivelul întregului program (fişier).
4)Dacă anumite funcţii se află plasate înaintea declaraţiilor acestor variabile, atunci ele
sunt vizibile doar pentru funcţiile care sunt plasate după aceste declaraţii.
Variabile globale:
a b monitor
0 0
20 0
20
10 10
a si b sunt declarate
ca varibile
globale Initial au
val 0
Variabile locale:
• Sunt declarate în corpul funcţiilor.
• Variabilele declarate în corpul funcţiei main() sunt locale
• Atributele variabilelor locale sunt:
• Clasa de memorare a variabilelor locale este, implicit, segmentul destivă.
Variabilele locale nu sunt iniţializate implicit cu 0. Dacă nu sunt iniţializate explicit de programator, elereţin
o valoare oarecare, numită valoare reziduală.
•Durata de viaţă a variabilelor locale este locală. Trăiesc atâta timp cât durează executarea funcţiei sau
blocului în care au fost definite.
Există posibilitatea ca acestea să fie alocate în registrele microprocesorului, caz în care declaraţia lor
trebuie precedată de cuvântul cheie register:
•Var globala
•Var locala la nivel de functie
Vizibilitatea variabilelor locale este la nivelul
blocului în care au fost declarate.
Vizibilitatea variabilelor locale
În cazul în care, într-un anumit bloc sunt vizibile mai multe variabile,
toate cu acelaşi nume, dar au domenii de vizibilitate diferite, se accesează
variabila cu vizibilitatea cea mai mică.
Var globala Var.localeEcran
a_global (=0) a_F a_F_Bloc
3 2 11 (a_F_Bloc)
2 (a_F)3 (a_global)
Dacă se declară o variabilă locală în ciclul for ea este vizibilă doar în
blocul for
Var locale
• O funcţie poate fi apelată printr-o instrucţiune de apel, de forma:
nume_funcţie (lista_parametrilor_efectivi);
• Parametrii efectivi trebuie să corespundă cu cei formali ca ordine şi tip.
APELUL UNEI FUNCTII
Functie de tip void ce nu returneaza o valoare Functie de tip int ce returneaza o valoare
Transmiterea parametrilor
Pentru memorarea parametrilor, subprogramele folosesc segmentul de stivă.
Memorarea parametrilor transmişi se face în ordinea în care aceştia figurează în
antet: de la stânga la dreapta.
În cadrul subprogramului, parametrii transmişi şi memoraţi în stivă sunt variabile.
Numele lor este cel din lista parametrilor formali.
Variabilele obţinute în urma memorării parametrilor transmişi sunt variabile locale
n ecran
1 2
1
Transmiterea parametrilor prin valoare
Se utilizează atunci când suntem interesaţi ca subprogramul să lucreze cu acea valoare, dar, în prelucrare,
nu ne interesează ca parametrul efectiv (cel din blocul apelant) să reţină valoarea modificată însubprogram.
adresa valoare afiseaza
&n (test) 12 2
&(n preia valoarea din
main in test)
&n (main) 1 1
STIV
A
adresa valoare afiseaza
Test(3) n=3 3
Test(3+4*5) 23 23
apel Variabila valoare ecran
c_main 4
d_main 3
suma(2,3) a_suma 2
b_suma 3
revenire 5
suma(2+7,3-1*2) a_suma 9
b_suma 1
revenire 10
suma(4,3) a_suma 4
b_suma 3
revenire 7
suma(1.9,3.3) a_suma 1
b_suma 3
revenire 4
Transmiterea „prin valoare” a tablourilor (vectorilor) permite ca funcţiile să întoarcă noile
valori ale acestora (care au fost atribuite în funcţii). Numele masivelor sunt de fapt
pointeri către componentele lor. La transmiterea numelui unui tablou ca parametru
efectiv, se transmite de fapt adresa de început a tabloului
apel Variabila
valoare
ecran
Citeste (a) n 4 4
i=1 2suma(2,3) i=2 5
i=3 6i=4 7
revenire
i=1 2
i=2 5
i=3 6i=4
7
Să se scrie o funcţie care calculează cel mai mare divizor comun pentru două
numere naturale nenule(utilizând algoritmul lui Euclid).
sa se afiseze ariile pentru un patrat si un dreptunghi
Sa se scrie o functie care sa afiseze suma cifrelor unui numar intreg dat
paramentru
Sa se scrie o functie care sa afiseze nr de cifre ale unui nr
Sa se afiseze toate numerele prime mai mici sau egale cu n
Sa se scrie o functie care sa verifice daca un numar intreg este sau nu palindrom (este egal cu
rasturnatul sau).
Sa se afiseze toate numerele perfecte mai mici sau egale cu n
Ex: 6=1+2+3 are suma divizorilor egal cu nr citit
Sa se afiseze toate patratele perfecte mai mici sau egale cu n
Să se determine cel mai mare divizor comun (c.m.m.d.c.)a doua numere întregi citite de la tastatura. (metoda scaderilor repetate)
Sa se scrie cate o functie care sa determine:
- cel mai mare divizor comun a doua numere intregi
date ca parametri.
- cel mai mic multiplu comun a doua numere intregi
date ca parametri Indicatii:
-Pentru determinarea cmmdc se va folosi
algoritmul lui Euclid prin impartiri repetate.
-Pentru determinarea cmmmc se va folosi relatia
dintre cmmmc si cmmdc:
cmmmc(a,b)=(a*b)/cmmdc(a,b)
Se considera un numar natural in baza 10. Se cere sa se scrie o functie care sa afiseze
reprezentarea numarului dat in baza 2.Exemplu: Pentru n=10 reprezentarea numarului
in baza 2 este 1010
Se dau două numere naturale n și m. Să se determine suma dintre oglinditul lui n și
oglinditul lui m.
Tema:
F(x)= (x+1)/(1+x^2) , x apartine[-1,1]
x+1 pentru x apartine ( -∞, -1 )
6/(1+x^2) x apartine (1, + ∞)
Este mecanismul specific C++ prin care putem modifica într-o funcție variabile dinafara funcției. În cazul transmiterii parametrilor prin referință, parametrii formali aiunei funcții sunt referințe ale parametrilor actuali. Acest lucru înseamnă că:•parametri actuali pot fi doar variabile, sau expresii ale căror rezultate suntsimilare variabilelor: elemente de tablou, câmp al unei structuri, etc.•pe stivă se memorează adresa variabilei date ca parametru actual.•toate modificările realizate în apelul funcției asupra parametrilor formali se fac defapt asupra parametrilor actuali. Parametrii actuali sunt modificați la ieșirea dinapel!•pentru a preciza că un parametru este transmis prin referință va fi precedat de
caracterul & în antetul funcției.
Trebuie amintit că în limbajul C nu este posibilă transmiterea parametrilor prinreferință. Dacă dorim să modificăm într-o funcție o variabilă din afara ei trebuie săfolosim pointeri.
Se citesc doua valori x si y, sa se afiseze valorile interscimbate
Transmiterea parametrilor prin referinta
Se utilizează atunci când ne interesează ca la revenirea din subprogram variabila transmisă
să reţină valoarea stabilită în timpul execuţiei programului şi nu valoarea de laapel.
Subprogramul reţine în stivă adresele acestor variabilei.
apel Variabila valoare ecran
Citeste (a, n) n 4 4
i=1 22
i=2 35
i=3 44i=4 55
revenire n 4
i=1 22
i=2 33
i=3 44
i=4 55
Se citește un tablou cu elemente numere întregi. Să se ordoneze crescător
elementele tabloului și apoi să se afișeze.
Tablourile se transmit prin valoare, dar orice
modificare a valorilor elementelor tabloului
dat ca parametru formal va afecta elementul
corespunzător al tabloului dat ca parametru
actual.
Pentru fiecare apel al unei funcții se adaugă pe stivă o zonă de memorie în care se
memorează variabilele locale și parametrii pentru apelul curent. Această zonă a
stivei va exista până la finalul apelului, după care se va elibera. Dacă din apelul
curent se face un alt apel, al altei funcții, se adaugă pe stivă o nouă zonă de
memorie, iar conținutul zonei anterioare este inaccesibil până la finalul acelui apel.
Se citeste de la tastaturã un sir de numere întregi.a) Sã se scrie un
subprogram care sã returneze elementul minim;
b) Sã se scrie un subprogram care sã returneze sirul ordonat crescãtor.
Se citeste de la tastaturã un sir de numere întregi.a) Sã se scrie un subprogram care sã returneze elementul maxim; b) Sã se scrie un subprogram care sã determine numãrul elementelor prime.
Se citeste de la tastaturã un sir de numere întregi a) Sã se scrie un subprogram
care sã determine suma elementelor impare aflate pe pozitiile pare;
b) Sã se scrie un subprogram care sã returneze un mesaj prin care sã se comunice dacã un element x citit de la tastaturã existã sau nu în sir.
Se citeste de la tastaturã elementele unei matrice patratica.Sã se afiseze matricea;
Se citesc elementele unei matrice a) Sa se afiseze matricea; b) Sa se scrie un subprogram care sa determine cel mai mare divizor comun al elementelor
situate în coltul stânga sus si coltul dreapta jos;