CATEGORII DOCUMENTE |
if (max<b)
max=b;
if (max<c)
max=c;
cout << 'max= '<<max;
Subprogramele sunt parti ale unui program, identificabile prin nume, care se pot activa la cerere prin intermediul acestor nume.
parametru efectiv = parametru actual = parametru real = parametru de apel
lista parametrilor efectivi = fie vida, fie o expresie sau mai multe despartite prin virgula
3.2. O functie care returneaza o valoare poate fi apelata fie printr-o instructiune de apel simpla (cazul functiilor care nu returneaza valori) si in plus poate fi apelata ca operand al unei expresii. In cazul in care functia se apelaza print-o instructiune de apel simpla, rezultatul functiei se pierde. Cand functia se apeleaza ca operand, valoarea returnata va fi utilizata in expresie.
Exemplul 3.1 |
Exemplul 3.2 |
# include <iostream.h> # include <conio.h> void f1 () void main (void) |
# include <iostream.h> # include <conio.h> void f1 (int k) void main (void) |
Se va afisa: Abc |
Se va afisa: abc abc abc |
Functia nu returneaza o valoare Functia nu are parametri Apelul functiei este o instructiune de apel simpla |
Functia nu returneaza o valoare Functia are un parametru formal de tip int Apelul functiei este o instructiune de apel sinpla si se face cu ajutorul unui parametru actual care este de acelasi tip cu tipul parametrului formal corespunzator |
Exemplul 3.3 |
Exemplul 3.4 |
# include <iostream.h> # include <math.h> # include <conio.h> int prim (int x) void main (void) |
# include <iostream.h> # include <math.h> # include <conio.h> int prim (int x) void main (void) |
Functia returneaza o valoare de tip int Functia are un parametru de tip int Rezultatul functiei este este utilizat in cadrul unei expresii. |
In cazul in care se intalneste un divizor a lui x se executa instructiunea return 0. Astfel apelul functiei se incheie. Daca x este numar prim, instructiunea return 0 nu se executa niciodata si in acest caz, dupa terminarea executiei instructiunii for, se executa instructiunea return 1 (care determina incheierea executiei functiei). |
In cazul in care tipul returnat de functie lipseste din definitia functiei, acesta este implicit int si nu void.
Exemplul 3.5 |
Exemplul 3.6 |
Exemplul 3.7 |
P( ) void main (void) |
p( ) void main (void) |
void p( ) void main (void) |
Compilatorul genereaza WARNING Se va afisa un numar intreg |
Se afiseaza 25 |
Compilatorul genereaza eroare |
4. Prototipul unei functii
Pentru a apela o functie, aceasta trebui mai intai definita. Astfel apelul unei functii trebuie precedat de definitia functiei respective.
O a doua posibilitate de apelare a functiei consta in scrierea prototipului functiei inainte ca acesta sa fie apelata.
Prototipul functiei contine informatii asemanatoare cu cele din antetul functiei. Pot lipsi numele parametrilor formali (conteaza doar tipul si ordinea acestora), in plus acesa este urmat de ";".
Exemplul 4.1.
# include <iostream.h> # include <conio.h> int max (int, int); void main (void) int max (int a, int b=2) |
PROTOTIPUL FUNTIEI APELUL FUNCTIEI DEFINITIA FUNCTIEI antetul functiei si - corpul functie |
5. Variabile locale si variabile globale
. Functia main.
In C, numele de funtie main determina prima instructiune pe care o va executa programul. Acesta este unica diferenta dintre main si celelalte functii. Din acest motiv se poate spune ca "orice se poate face in main se poate face si in celelalte functii".
Variabile locale
La fel cum se declara variabilele in cadrul functiei main, la fel se pot declara varibile in cadrul celorlalte functii. Aceste variabile se numesc locale si sunt accesibile doar de functia care le-a declarat. La fel in cadrul unei functii se pot apela si alte functii, ca si in main, daca acestea au fost definite inaintea eventualului apel sau daca este prezent un prototip de functie inaintea functiei apelante si o definitie de functie in cadrul programului respectiv sau in fisierele incluse in programului respectiv.
Variabile globale
Variabilele globale sunt declarate inafara oricarei functii si pot sunt vizibile (pot fi utilizate) in tot programul (in programul principal si in subprograme) din momentul declararii lor.
Exemplul 5.1 |
Exemplul 5.2 |
Exemplul 5.3 |
# include <iostream.h> # include <conio.h> int N; void f1() void main (void) |
# include <iostream.h> # include <conio.h> int N; void f1() int P=9; void main (void) |
# include <iostream.h> # include <conio.h> int N; void f1(int p) void main (void) |
N este variabila globala. Poate fi accesata in cadrul oricarei functii. x este variabila locala, vizibila doar in cadrul functiei f1() Se va afisa: 4 |
Compilatorul genereaza eroare deoarece functia main incearca sa acceseze variabila x care este vizibila doar in functia f1(). Compilatorul genereaza eroare deoarece P este accesata in f1() inainte de a fi declarata. |
Se afiseaza 3 N este variabila globala. Poate fi accesata in cadrul oricarei functii. x este variabila locala. Poate fi accesata doar in cadrul functiei f1() p este parametru formal. Poate fi accesat doar in f1(). |
Regula de omonimie
In cazul in care exista o variabila locala care are acelasi nume cu o variabila globala, aceste doua variabile se numesc variabile omonime.
Variabilele locale sunt prioritare (ascund) variabilele globale omonime.
Exemplul 5.4 |
|
Int N=10; Void f1() void main (void) |
Variabila N este definita atat ca variabila globala cat si ca variabila locala in f1(). Se va afisa: Functia f1() actioneaza asupra variabilei locale N. Functia main() actioneaza supra variabilei globale N. |
Intrebare. Cum gestioneaza compilatorul cele doua variabile omonime ?
Raspuns:
Variabilelor globale li se rezerva spatiu de memorare la inceputul executiei programului, intr-o zona de memorie numita "zona de date". Acest spatiu va fi ocupat pana la incheierea executiei programului.
Variabilelor locale li se rezerva spatiu intr-o zona speciala de memorie numita "stiva". La incheierea executiei subprogramului, continutul stivei este eliberat. Din acest motiv, variabilele globale sun vizibile doar in interiorul subprogramului in care au fost declarate.
6. Parametri formali si parametri actuali
Parametri formali apar in antetul subprogramului si sunt utilizati de subprogram pentru descrierea abstracta a unui proces de calcul .
Parametri actuali apar in instructiunea de apelare a uni subprogram si sunt folositi la executia unui proces de calcul pentru valori concrete.
Parametrii formali nu sunt variabile. O variabila este caracterizata de nume, tip, si adresa. Legarea unui parametru formal la o adresa se realizeaza in timpul executiei instructiunii de apelare a subprogramului.
7. Apel prin valoare si apel prin referinta
Exista doua tipuri de apel al subprogramelor:
A. Apel prin valoare
B. Apel prin referinta
7.1. Apel prin valoare - se transmite o copie a parametrului actual.
Valorile transmise la apelul unui subprogram sunt memorate in stiva. Datorita faptului ca, dupa terminarea executiei unui subprogram, stiva este eliberata, in cazul apelului prin valoare parametrul actual nu se modifica (se opereaza asupra unei copii a parametrului efectiv)
7.2. Apel prin referinta - se transmite adresa parametrului actual.
In cazul apelului prin referinta, subprogramul, cunoscand adresa parametrului actual, actioneaza direct asupra locatiei de memorie indicata de aceasta, modificand valoarea parametrului actual.
In C, implicit apelul este prin valoare. Pentru a specifica un apel prin referinta, in lista parametrilor formali, numele parametrului formal va trebui precedat de cuvantul simbolul &
Exemplul 7.1 |
|
void schimba_valoare (int x, int y) void schimba_referinta (int &a, int &b) void main (void) |
APEL PRIN VALOARE APEL PRIN REFERINTA Se va afisa: M=1 N=5 M=5 N=1 |
8. Transmiterea tablourilor unei functii
In C numele unui tablou reprezinta adresa primului element din tablou, celelalte elemente fiind memorate la adresele urmatoare de memorie. Din acest motiv, in cazul transmiterii unui tablou unei functii se transmite de fapt o adresa, realizandu-se un apel numit pointer care determina modificarea parametrului actual.
Exemplul 8.1 |
|
# include <iostream.h> # include <conio.h> # include <stdlib.h> void Genereaza (int A[100], int &x) void main (void) |
Functia modifica parametrul actual T prin intermediul parametrului formal A deoarece se relizeaza apelul prin pointer. Functia modifica valoarea parametrului actual N prin intermediul parametrului x deoarece se realizeaza apelul prin referinta. |
Datorita faptului ca functia foloseste doar adresa primului element pentru a accesa celelalte elemente ale vectorului, in cadrul prototipului sau antetului functiei este suficient daca se specifica faptul ca parametrul este un vector, nefiind necesara precizarea numarului de elemente ale vectorului.
Exemplul 8.2. |
|
# include <iostream.h> # include <conio.h> # include <stdlib.h> void Genereaza (int A[], int &x) void main (void) |
Functia modifica parametrul actual T prin intermediul parametrului formal A deoarece se relizeaza apelul prin pointer. Functia modifica valoarea parametrului actual N prin intermediul parametrului x deoarece se realizeaza apelul prin referinta. |
O matrice este gestionata in memoria interna ca o succesiune de elemente. Liniile sunt memorate succesiv. Astfel pentru a retine o matrice este suficient daca se cunosc: adresa de inceput a primului element din matrice si lungimea unei linii (adica numarul de coloane). Astfel la transmiterea unei matrice intr-o functie este suficient daca se precizeaza numele matrice respective (adresa de primului element) si dimensiunea unei linii (numarul de coloane).
Exemplul 8.3. |
void Genereaza (int A[][10], int &x, int &y) void Afiseaza (int A[][10], int x, int y) cout<<endl; } void main (void) |
9. Transmiterea sirurilor de caractere unei functii
Datorita faptului ca pentru a memora un sir de caractere compilatorul pastreaza doar adresa de inceput a sirului de caractere iar restul caracterelor sunt memorate folosind octetii urmatori pana la intalnirea unui in cazul unui parametru de tip sir de caractere, functia primeste adresa de inceput a sirului, modificand astfel parametrul actual.
Exemplul 9.1. |
void modifica (char * p) void afiseaza (char * p) void main (void) |
10. Transmiterea structurilor unei functii
Exemplul 10.1. |
|
struct persoana ; void Citeste (persoana &x) void Afiseaza (persoana x) void main (void) |
Modificarea membrilor structurii necesita apelul prin referinta Pentru a afisa o structura este suficient apelul prin valoare |
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 3295
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved